!=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== module M_intrinsics implicit none private public help_intrinsics !interface help_intrinsics ! module procedure help_intrinsics_all ! module procedure help_intrinsics_one !end interface help_intrinsics contains !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== function help_intrinsics(name,prefix,topic,m_help) result (textblock) character(len=*),intent(in) :: name logical,intent(in),optional :: prefix logical,intent(in),optional :: topic logical,intent(in),optional :: m_help character(len=256),allocatable :: textblock(:) character(len=256),allocatable :: narrow(:) character(len=256) :: header character(len=:),allocatable :: a, b, c integer :: i, j, k, p, pg select case(name) case('','manual','intrinsics','fortranmanual','fortran_manual') textblock=help_intrinsics_all(prefix,topic,m_help) case('fortran','toc','toc3','toc5','toc7') textblock=help_intrinsics_section() do i=1,size(textblock) p = index(textblock(i), '[') pg = index(textblock(i), ']') if(p.gt.0.and.pg.gt.p)then a=textblock(i)(:p-1) b=textblock(i)(p:pg) c=textblock(i)(pg+1:) textblock(i)=b//' '//a//c endif enddo call sort_name(textblock) allocate(narrow(0)) header='' do i=1,size(textblock) j=index(textblock(i),']') select case(name) case('toc3') if(index(textblock(i),'(3)').eq.0)cycle case('toc5') if(index(textblock(i),'(5)').eq.0)cycle case('toc7') k=0 k=max(k,index(textblock(i),'(7)')) k=max(k,index(textblock(i),'(7f)')) if(k==0)cycle end select if (textblock(i)(:j).ne.header)then header=textblock(i)(:j) narrow=[character(len=256) :: narrow,header] endif textblock(i)=textblock(i)(j+1:) narrow=[character(len=256) :: narrow,' '//paragraph(textblock(i),70)] enddo textblock=narrow case default textblock=help_intrinsics_one(name,prefix,topic,m_help) end select end function help_intrinsics !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== function paragraph(source_string,length) !$@(#) M_strings::paragraph(3f): wrap a long string into a paragraph character(len=*),intent(in) :: source_string integer,intent(in) :: length integer :: itoken integer :: ibegin integer :: iend character(len=*),parameter :: delimiters=' ' character(len=:),allocatable :: paragraph(:) integer :: ilines integer :: ilength integer :: iword, iword_max integer :: i !----------------------------------------------------------------------------------------------------------------------------------- ! parse string once to find out how big to make the returned array, then redo everything but store the data ! could store array of endpoints and leave original whitespace alone or many other options do i=1,2 iword_max=0 ! length of longest token ilines=1 ! number of output line output will go on ilength=0 ! length of output line so far itoken=0 ! must set ITOKEN=0 before looping on strtok(3f) on a new string. do while ( strtok(source_string,itoken,ibegin,iend,delimiters) ) iword=iend-ibegin+1 iword_max=max(iword_max,iword) if(iword > length)then ! this token is longer than the desired line length so put it on a line by itself if(ilength /= 0)then ilines=ilines+1 endif if(i == 2)then ! if paragraph has been allocated store data, else just gathering data to determine size of paragraph paragraph(ilines)=source_string(ibegin:iend)//' ' endif ilength=iword+1 elseif(ilength+iword <= length)then ! this word will fit on current line if(i == 2)then paragraph(ilines)=paragraph(ilines)(:ilength)//source_string(ibegin:iend) endif ilength=ilength+iword+1 else ! adding this word would make line too long so start new line ilines=ilines+1 ilength=0 if(i == 2)then paragraph(ilines)=paragraph(ilines)(:ilength)//source_string(ibegin:iend) endif ilength=iword+1 endif enddo if(i==1)then ! determined number of lines needed so allocate output array allocate(character(len=max(length,iword_max)) :: paragraph(ilines)) paragraph=' ' endif enddo paragraph=paragraph(:ilines) end function paragraph !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== FUNCTION strtok(source_string,itoken,token_start,token_end,delimiters) result(strtok_status) ! JSU- 20151030 !$@(#) M_strings::strtok(3f): Tokenize a string character(len=*),intent(in) :: source_string ! Source string to tokenize. character(len=*),intent(in) :: delimiters ! list of separator characters. May change between calls integer,intent(inout) :: itoken ! token count since started logical :: strtok_status ! returned value integer,intent(out) :: token_start ! beginning of token found if function result is .true. integer,intent(inout) :: token_end ! end of token found if function result is .true. integer,save :: isource_len !---------------------------------------------------------------------------------------------------------------------------- ! calculate where token_start should start for this pass if(itoken <= 0)then ! this is assumed to be the first call token_start=1 else ! increment start to previous end + 1 token_start=token_end+1 endif !---------------------------------------------------------------------------------------------------------------------------- isource_len=len(source_string) ! length of input string !---------------------------------------------------------------------------------------------------------------------------- if(token_start > isource_len)then ! user input error or at end of string token_end=isource_len ! assume end of token is end of string until proven otherwise so it is set strtok_status=.false. return endif !---------------------------------------------------------------------------------------------------------------------------- ! find beginning of token do while (token_start <= isource_len) ! step thru each character to find next delimiter, if any if(index(delimiters,source_string(token_start:token_start)) /= 0) then token_start = token_start + 1 else exit endif enddo !---------------------------------------------------------------------------------------------------------------------------- token_end=token_start do while (token_end <= isource_len-1) ! step thru each character to find next delimiter, if any if(index(delimiters,source_string(token_end+1:token_end+1)) /= 0) then ! found a delimiter in next character exit endif token_end = token_end + 1 enddo !---------------------------------------------------------------------------------------------------------------------------- if (token_start > isource_len) then ! determine if finished strtok_status=.false. ! flag that input string has been completely processed else itoken=itoken+1 ! increment count of tokens found strtok_status=.true. ! flag more tokens may remain endif !---------------------------------------------------------------------------------------------------------------------------- end function strtok !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== function help_intrinsics_section() result (textblock) !@(#) grab lines in NAME section and append them to generate an index of manpages character(len=256),allocatable :: textblock(:) character(len=256),allocatable :: add(:) character(len=256),allocatable :: label character(len=10) :: cnum integer :: i integer :: icount logical :: is_label logical :: grab allocate(textblock(0)) icount=1 do write(cnum,'(i0)') icount add=help_intrinsics_one(cnum) ! get a document by number if( size(add) .eq. 0 ) exit label='' grab=.false. is_label=.false. ! look for NAME then append everything together till a line starting in column 1 that is all uppercase letters ! and assume that is the beginning of the next section to extract the NAME section as one line do i=1,size(add) if(add(i).eq.'')cycle is_label=verify(trim(add(i)),'ABCDEFGHIJKLMNOPQRSTUVWXYZ _') == 0 if(is_label.and.add(i).eq.'NAME')then grab=.true. elseif(is_label)then exit elseif(grab)then label=adjustl(trim(label))//' '//adjustl(trim(add(i))) endif enddo textblock=[character(len=256) :: textblock,label] icount=icount + 1 enddo end function help_intrinsics_section !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== function help_intrinsics_all(prefix,topic,m_help) result (textblock) logical,intent(in),optional :: prefix logical,intent(in),optional :: topic logical,intent(in),optional :: m_help character(len=256),allocatable :: textblock(:) character(len=256),allocatable :: header(:) character(len=256),allocatable :: add(:) character(len=10) :: cnum integer :: icount allocate(textblock(0)) icount=1 do write(cnum,'(i0)') icount add=help_intrinsics_one(cnum,prefix,topic,m_help) if( size(add) .eq. 0 ) exit textblock=[character(len=256) :: textblock,add] icount=icount + 1 enddo if(present(m_help))then if(m_help)then header=[ character(len=256) :: & '================================================================================', & 'SUMMARY', & ' The primary Fortran topics are', & ' abs achar acos', & ' acosh adjustl adjustr', & ' aimag aint all', & ' allocated anint any', & ' asin asinh associated', & ' atan atan2 atanh', & ' atomic_add atomic_and atomic_cas', & ' atomic_define atomic_fetch_add atomic_fetch_and', & ' atomic_fetch_or atomic_fetch_xor atomic_or', & ' atomic_ref atomic_xor backspace', & ' bessel_j0 bessel_j1 bessel_jn', & ' bessel_y0 bessel_y1 bessel_yn', & ' bge bgt bit_size', & ' ble block blt', & ' btest c_associated ceiling', & ' c_f_pointer c_f_procpointer c_funloc', & ' char c_loc close', & ' cmplx co_broadcast co_lbound', & ' co_max co_min command_argument_count', & ' compiler_options compiler_version conjg', & ' continue co_reduce cos', & ' cosh co_sum co_ubound', & ' count cpu_time cshift', & ' c_sizeof date_and_time dble', & ' digits dim dot_product', & ' dprod dshiftl dshiftr', & ' eoshift epsilon erf', & ' erfc erfc_scaled event_query', & ' execute_command_line exit exp', & ' exponent extends_type_of findloc', & ' float floor flush', & ' fraction gamma get_command', & ' get_command_argument get_environment_variable huge', & ' hypot iachar iall', & ' iand iany ibclr', & ' ibits ibset ichar', & ' ieor image_index include', & ' index int ior', & ' iparity is_contiguous ishft', & ' ishftc is_iostat_end is_iostat_eor', & ' kind lbound leadz', & ' len len_trim lge', & ' lgt lle llt', & ' log log10 log_gamma', & ' logical maskl maskr', & ' matmul max maxexponent', & ' maxloc maxval merge', & ' merge_bits min minexponent', & ' minloc minval mod', & ' modulo move_alloc mvbits', & ' nearest new_line nint', & ' norm2 not null', & ' num_images pack parity', & ' popcnt poppar precision', & ' present product radix', & ' random_number random_seed range', & ' rank real repeat', & ' reshape return rewind', & ' rrspacing same_type_as scale', & ' scan selected_char_kind selected_int_kind', & ' selected_real_kind set_exponent shape', & ' shifta shiftl shiftr', & ' sign sin sinh', & ' size sngl spacing', & ' spread sqrt stop', & ' storage_size sum system_clock', & ' tan tanh this_image', & ' tiny trailz transfer', & ' transpose trim ubound', & ' unpack verify', & ''] textblock=[header,textblock] endif endif end function help_intrinsics_all !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== function help_intrinsics_one(name,prefix,topic,m_help) result (textblock) character(len=*),intent(in) :: name logical,intent(in),optional :: prefix logical,intent(in),optional :: m_help logical,intent(in),optional :: topic character(len=256),allocatable :: textblock(:) character(len=:),allocatable :: shortname integer :: i select case(name) case('1','abs') textblock=[character(len=256) :: & '', & 'abs(3fortran) abs(3fortran)', & '', & 'NAME', & ' ABS(3) - [NUMERIC] Absolute value', & '', & 'SYNOPSIS', & ' result = abs(a)', & '', & ' elemental TYPE(kind=KIND) function abs(a)', & '', & ' TYPE(kind=KIND),intent(in) :: a', & '', & 'CHARACTERISTICS', & ' o A may be any real, integer, or complex value.', & '', & ' o If A is complex the returned value will be a real with the same kind as', & ' A.', & '', & ' Otherwise the returned type and kind is the same as for A.', & '', & 'DESCRIPTION', & ' ABS(3) computes the absolute value of numeric argument A.', & '', & ' In mathematics, the absolute value or modulus of a real number X, denoted', & ' |X|, is the magnitude of X without regard to its sign.', & '', & ' The absolute value of a number may be thought of as its distance from zero.', & ' So for a complex value the absolute value is a real number with magnitude', & ' SQRT(X%RE**2,X%IM**2), as if the real component is the x value and the', & ' imaginary value is the y value for the point <x,y>.', & '', & 'OPTIONS', & ' o A : The value to compute the absolute value of.', & '', & 'RESULT', & ' If A is of type integer or real, the value of the result is the absolute', & ' value |A| and of the same type and kind as the input argument.', & '', & ' If A is complex with value (X, Y), the result is a real equal to a', & ' processor-dependent approximation to', & '', & ' sqrt(x**2 + y**2)', & '', & ' computed without undue overflow or underflow (that means the computation of', & ' the result can overflow the allowed magnitude of the real value returned,', & ' and that very small values can produce underflows if they are squared while', & ' calculating the returned value, for example).', & '', & ' That is, if you think of non-complex values as being complex values on the', & ' x-axis and complex values as being x-y points <x%re,x%im> the result of', & ' ABS(3) is the (positive) magnitude of the distance of the value from the', & ' origin.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_abs', & ' implicit none', & ' integer,parameter :: dp=kind(0.0d0)', & '', & ' ! some values to use with ABS(3)', & ' integer :: i = -1', & ' real :: x = -1.0', & ' complex :: z = (-3.0,-4.0)', & ' doubleprecision :: rr = -45.78_dp', & '', & ' ! some formats for pretty-printing some information', & ' character(len=*),parameter :: &', & ' frmt = ''(1x,a15,1x," In: ",g0, T51," Out: ",g0)'', &', & ' frmtc = ''(1x,a15,1x," In: (",g0,",",g0,")",T51," Out: ",g0)'', &', & ' gen = ''(*(g0,1x))''', & '', & ' ! the basics', & ' print gen, ''basic usage:''', & ' ! any integer, real, or complex type', & ' write(*, frmt) ''integer '', i, abs(i)', & ' write(*, frmt) ''real '', x, abs(x)', & ' write(*, frmt) ''doubleprecision '', rr, abs(rr)', & ' write(*, frmtc) ''complex '', z, abs(z)', & '', & ' ! elemental', & ' print gen, ''abs is elemental:'', abs([20, 0, -1, -3, 100])', & '', & ' ! the returned value for complex input can be thought of as the', & ' ! distance from the origin <0,0>', & ' print gen, ''distance of ('', z, '') from zero is'', abs( z )', & '', & ' call DUSTY_CORNERS_1("beware of abs(-huge(0)-1)")', & ' call DUSTY_CORNERS_2("beware of losing precision using CMPLX(3)")', & ' call DUSTY_CORNERS_3("beware of overflow of complex values")', & ' call DUSTY_CORNERS_4("custom meaning for absolute value of COMPLEX")', & '', & ' contains', & '', & ' subroutine DUSTY_CORNERS_1(message)', & ' character(len=*),intent(in) :: message', & '', & ' ! A dusty corner is that abs(-huge(0)-1) of an integer would be', & ' ! a representable negative value on most machines but result in a', & ' ! positive value out of range.', & '', & ' print gen, message', & ' ! By definition:', & ' ! You can take the absolute value of any value whose POSITIVE value', & ' ! is representable with the same type and kind.', & '', & ' print gen, ''abs range test : '', abs(huge(0)), abs(-huge(0))', & ' print gen, ''abs range test : '', abs(huge(0.0)), abs(-huge(0.0))', & ' print gen, ''abs range test : '', abs(tiny(0.0)), abs(-tiny(0.0))', & '', & ' end subroutine DUSTY_CORNERS_1', & '', & ' subroutine DUSTY_CORNERS_2(message)', & ' character(len=*),intent(in) :: message', & '', & ' ! dusty corner: "kind=dp" is required or the value returned by', & ' ! CMPLX() is a default real instead of double precision.', & '', & ' ! Working with complex values you often encounter the CMPLX(3)', & ' ! function. CMPLX(3) defaults to returning a default REAL regardless', & ' ! of input type. Not really a direct problem with ABS(2f) per-se,', & ' ! but a common error when working with doubleprecision complex values', & '', & ' print gen, message', & ' print gen, ''real result versus doubleprecision result'', &', & ' & abs(cmplx(30.0_dp,40.0_dp)), &', & ' & abs(cmplx(30.0_dp,40.0_dp,kind=dp))', & '', & ' end subroutine DUSTY_CORNERS_2', & '', & ' subroutine DUSTY_CORNERS_3(message)', & ' character(len=*),intent(in) :: message', & ' print gen, message', & '', & ' ! this will probably cause an overflow error, or', & ' !print gen, abs(cmplx( huge(0.0), huge(0.0) ))', & '', & ' print gen, ''because the biggest default real is'',huge(0.0)', & ' print gen, ''because returning magnitude of sqrt(x%re**2,x%im**2)''', & '', & ' end subroutine DUSTY_CORNERS_3', & '', & ' subroutine DUSTY_CORNERS_4(message)', & ' character(len=*),intent(in) :: message', & ' print gen, message', & '', & ' ! if you do not want the distance for a complex value you', & ' ! might want something like returning a complex value with', & ' ! both the imaginary and real parts. One way to do that is', & '', & ' print gen, cmplx(abs(z%re),abs(z%im),kind=kind(z))', & '', & ' end subroutine DUSTY_CORNERS_4', & '', & ' end program demo_abs', & '', & ' Results:', & '', & ' > integer In: -1 Out: 1', & ' > real In: -1.00000000 Out: 1.00000000', & ' > doubleprecision In: -45.78000000000000 Out: 45.78000000000000', & ' > complex In: (-3.00000000,-4.00000000) Out: 5.00000000', & ' > abs is elemental: 20 0 1 3 100', & ' > distance of ( -3.00000000 -4.00000000 ) from zero is 5.00000000', & ' > beware of abs(-huge(0)-1)', & ' > abs range test : 2147483647 2147483647', & ' > abs range test : 0.340282347E+39 0.340282347E+39', & ' > abs range test : 0.117549435E-37 0.117549435E-37', & ' > beware of losing precision using CMPLX(3)', & ' > real result versus doubleprecision result 50.0000000 50.00000000000000', & ' > beware of overflow of complex values', & ' > because the biggest default real is 0.340282347E+39', & ' > because returning magnitude of sqrt(x%re**2,x%im**2)', & ' > making your own meaning for ABS(COMPLEX_VALUE)', & ' > 3.00000000 4.00000000', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' SIGN(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 abs(3fortran)', & ''] shortname="abs" call process() case('2','achar') textblock=[character(len=256) :: & '', & 'achar(3fortran) achar(3fortran)', & '', & 'NAME', & ' ACHAR(3) - [CHARACTER:CONVERSION] Returns a character in a specified', & ' position in the ASCII collating sequence', & '', & 'SYNOPSIS', & ' result = achar(i [,kind])', & '', & ' elemental character(len=1,kind=KIND) function achar(i,KIND)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o The character kind returned is the value of KIND if present. otherwise,', & ' a single default character is returned.', & '', & 'DESCRIPTION', & ' ACHAR(3) returns the character located at position I (commonly called the', & ' ADE or ASCII Decimal Equivalent) in the ASCII collating sequence.', & '', & ' The ACHAR(3) function is often used for generating in-band escape sequences', & ' to control terminal attributes, as it makes it easy to print unprintable', & ' characters such as escape and tab. For example:', & '', & ' write(*,''(*(a))'')achar(27),''[2J''', & '', & ' will clear the screen on an ANSI-compatible terminal display,', & '', & 'NOTE', & ' The ADEs (ASCII Decimal Equivalents) for ASCII are', & '', & ' *-------*-------*-------*-------*-------*-------*-------*-------*', & ' | 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel|', & ' | 08 bs | 09 ht | 10 nl | 11 vt | 12 np | 13 cr | 14 so | 15 si |', & ' | 16 dle| 17 dc1| 18 dc2| 19 dc3| 20 dc4| 21 nak| 22 syn| 23 etb|', & ' | 24 can| 25 em | 26 sub| 27 esc| 28 fs | 29 gs | 30 rs | 31 us |', & ' | 32 sp | 33 ! | 34 " | 35 # | 36 $ | 37 % | 38 & | 39 '' |', & ' | 40 ( | 41 ) | 42 * | 43 + | 44 , | 45 - | 46 . | 47 / |', & ' | 48 0 | 49 1 | 50 2 | 51 3 | 52 4 | 53 5 | 54 6 | 55 7 |', & ' | 56 8 | 57 9 | 58 : | 59 ; | 60 < | 61 = | 62 > | 63 ? |', & ' | 64 @ | 65 A | 66 B | 67 C | 68 D | 69 E | 70 F | 71 G |', & ' | 72 H | 73 I | 74 J | 75 K | 76 L | 77 M | 78 N | 79 O |', & ' | 80 P | 81 Q | 82 R | 83 S | 84 T | 85 U | 86 V | 87 W |', & ' | 88 X | 89 Y | 90 Z | 91 [ | 92 \ | 93 ] | 94 ^ | 95 _ |', & ' | 96 ` | 97 a | 98 b | 99 c |100 d |101 e |102 f |103 g |', & ' |104 h |105 i |106 j |107 k |108 l |109 m |110 n |111 o |', & ' |112 p |113 q |114 r |115 s |116 t |117 u |118 v |119 w |', & ' |120 x |121 y |122 z |123 { |124 | |125 } |126 ~ |127 del|', & ' *-------*-------*-------*-------*-------*-------*-------*-------*', & '', & 'OPTIONS', & ' o I : the integer value to convert to an ASCII character, in the range 0 to', & ' 127. : ACHAR(3) shall have the value C for any character C capable of', & ' representation as a default character.', & '', & ' o KIND : a integer initialization expression indicating the kind parameter', & ' of the result.', & '', & 'RESULT', & ' Assuming I has a value in the range 0 <= I <= 127, the result is the', & ' character in position I of the ASCII collating sequence, provided the', & ' processor is capable of representing that character in the character kind of', & ' the result; otherwise, the result is processor dependent.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_achar', & ' use,intrinsic::iso_fortran_env,only:int8,int16,int32,int64', & ' implicit none', & ' integer :: i', & ' i=65', & ' write(*,''("decimal =",i0)'')i', & ' write(*,''("character =",a1)'')achar(i)', & ' write(*,''("binary =",b0)'')achar(i)', & ' write(*,''("octal =",o0)'')achar(i)', & ' write(*,''("hexadecimal =",z0)'')achar(i)', & '', & ' write(*,''(8(i3,1x,a,1x))'')(i,achar(i), i=32,126)', & '', & ' write(*,''(a)'')upper(''Mixed Case'')', & ' contains', & ' ! a classic use of achar(3) is to convert the case of a string', & '', & ' pure elemental function upper(str) result (string)', & ' !', & ' !$@(#) upper(3): function to return a trimmed uppercase-only string', & ' !', & ' ! input string to convert to all uppercase', & ' character(*), intent(in) :: str', & ' ! output string that contains no miniscule letters', & ' character(len(str)) :: string', & ' integer :: i, iend', & ' integer,parameter :: toupper = iachar(''A'')-iachar(''a'')', & ' iend=len_trim(str)', & ' ! initialize output string to trimmed input string', & ' string = str(:iend)', & ' ! process each letter in the string', & ' do concurrent (i = 1:iend)', & ' select case (str(i:i))', & ' ! located miniscule letter', & ' case (''a'':''z'')', & ' ! change miniscule to majuscule letter', & ' string(i:i) = achar(iachar(str(i:i))+toupper)', & ' end select', & ' enddo', & ' end function upper', & ' end program demo_achar', & '', & ' Results:', & '', & ' > decimal =65', & ' > character =A', & ' > binary =1000001', & ' > octal =101', & ' > hexadecimal =41', & ' > 32 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ''', & ' > 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 /', & ' > 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7', & ' > 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ?', & ' > 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G', & ' > 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O', & ' > 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W', & ' > 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _', & ' > 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g', & ' > 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o', & ' > 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w', & ' > 120 x 121 y 122 z 123 { 124 | 125 } 126 ~', & ' > MIXED CASE', & '', & 'STANDARD', & ' FORTRAN 77. KIND argument added Fortran 2003', & '', & 'SEE ALSO', & ' CHAR(3), IACHAR(3), ICHAR(3)', & '', & 'RESOURCES', & ' o ANSI escape sequences', & '', & ' o M_attr module for controlling ANSI-compatible terminals', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 achar(3fortran)', & ''] shortname="achar" call process() case('3','acos') textblock=[character(len=256) :: & '', & 'acos(3fortran) acos(3fortran)', & '', & 'NAME', & ' ACOS(3) - [MATHEMATICS:TRIGONOMETRIC] Arccosine (inverse cosine) function', & '', & 'SYNOPSIS', & ' result = acos(x)', & '', & ' elemental TYPE(kind=KIND) function acos(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o TYPE may be real or complex', & '', & ' o KIND may be any kind supported by the associated type.', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' ACOS(3) computes the arccosine of X (inverse of COS(X)).', & '', & 'OPTIONS', & ' o X : The value to compute the arctangent of. If the type is real, the', & ' value must satisfy |X| <= 1.', & '', & 'RESULT', & ' The return value is of the same type and kind as X. The real part of the', & ' result is in radians and lies in the range 0 <= ACOS(X%RE) <= PI .', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_acos', & ' use, intrinsic :: iso_fortran_env, only : real32,real64,real128', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' real(kind=real64) :: x , d2r', & '', & ' ! basics', & ' x = 0.866_real64', & ' print all,''acos('',x,'') is '', acos(x)', & '', & ' ! acos(-1) should be PI', & ' print all,''for reference'', new_line(''a''), &', & ' &''PI ~= 3.14159265358979323846264338327950288419716939937510''', & ' write(*,*) acos(-1.0_real64)', & ' d2r=acos(-1.0_real64)/180.0_real64', & ' print all,''90 degrees is '', d2r*90.0_real64, '' radians''', & ' ! elemental', & ' print all,''elemental'',acos([-1.0,-0.5,0.0,0.50,1.0])', & ' ! complex', & ' print *,''complex'',acos( (-1.0, 0.0) )', & ' print *,''complex'',acos( (-1.0, -1.0) )', & ' print *,''complex'',acos( ( 0.0, -0.0) )', & ' print *,''complex'',acos( ( 1.0, 0.0) )', & '', & ' end program demo_acos', & '', & ' Results:', & '', & ' > acos( 0.86599999999999999 ) is 0.52364958093182890', & ' > for reference', & ' > PI ~= 3.14159265358979323846264338327950288419716939937510', & ' > 3.1415926535897931', & ' > 90 degrees is 1.5707963267948966 radians', & ' > elemental 3.14159274 2.09439516 1.57079637 1.04719758 0.00000000', & ' > complex (3.14159274,-0.00000000)', & ' > complex (2.23703575,1.06127501)', & ' > complex (1.57079637,0.00000000)', & ' > complex (0.00000000,-0.00000000)', & '', & 'STANDARD', & ' FORTRAN 77 ; for a complex argument - Fortran 2008', & '', & 'SEE ALSO', & ' Inverse function: COS(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 acos(3fortran)', & ''] shortname="acos" call process() case('4','acosd') textblock=[character(len=256) :: & '', & 'acosd(3fortran) acosd(3fortran)', & '', & 'NAME', & ' ACOSD(3) - [MATHEMATICS:TRIGONOMETRIC] Arccosine (inverse cosine) function', & ' in degrees', & '', & 'SYNOPSIS', & ' result = acosd(x)', & '', & ' elemental real(kind=KIND) function acosd(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o KIND may be any kind supported by the real type.', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' ACOSD(3) computes the arccosine of X in degrees (inverse of COSD(X)). For', & ' example, ACOSD(-1.0) has the value 180.0 (approximately).', & '', & 'OPTIONS', & ' o X : The value to compute the arctangent of. If the type is real, the', & ' value must satisfy |X| <= 1.', & '', & 'RESULT', & ' The return value is of the same type and kind as X. The result has a value', & ' equal to a processor-dependent approximation to the arc cosine of X. It is', & ' expressed in degrees and lies in the range', & '', & ' 0 <= ACOSD (X) <= 180', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_acosd', & ' use, intrinsic :: iso_fortran_env, only : real32,real64,real128', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' real(kind=real64) :: x , d2r', & '', & ' ! basics', & ' print *,''acosd(-1.0) -->'',acosd( -1.0 )', & ' print *,''acosd( 0.0) -->'',acosd( -1.0 )', & ' print *,''acosd( 1.0) -->'',acosd( 0.0 )', & ' x = 0.866_real64', & ' print all,''acosd('',x,'') is '', acosd(x)', & ' ! any real kind', & ' write(*,*) acosd(-1.0_real64)', & ' ! elemental', & ' print all,''elemental'',acosd([-1.0,-0.5,0.0,0.50,1.0])', & ' !', & ' end program demo_acosd', & '', & ' Results:', & '', & ' > acosd(-1.0) --> 180.000000', & ' > acosd( 0.0) --> 180.000000', & ' > acosd( 1.0) --> 90.0000000', & ' > acosd( 0.86599999999999999 ) is 30.002910931188026', & ' > 180.00000000000000', & ' > elemental 180.000000 120.000000 90.0000000 60.0000000 0.00000000', & '', & 'STANDARD', & ' FORTRAN 2023', & '', & 'SEE ALSO', & ' Inverse function: COSD(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 acosd(3fortran)', & ''] shortname="acosd" call process() case('5','acosh') textblock=[character(len=256) :: & '', & 'acosh(3fortran) acosh(3fortran)', & '', & 'NAME', & ' ACOSH(3) - [MATHEMATICS:TRIGONOMETRIC] Inverse hyperbolic cosine function', & '', & 'SYNOPSIS', & ' result = acosh(x)', & '', & ' elemental TYPE(kind=KIND) function acosh(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o TYPE may be real or complex', & '', & ' o KIND may be any kind supported by the associated type.', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' ACOSH(3) computes the inverse hyperbolic cosine of X in radians.', & '', & 'OPTIONS', & ' o X : The value to compute the hyperbolic cosine of. A real value should be', & ' >= 1 or the result with be a Nan.', & '', & 'RESULT', & ' The result has a value equal to a processor-dependent approximation to the', & ' inverse hyperbolic cosine function of X.', & '', & ' If X is complex, the imaginary part of the result is in radians and lies', & ' between', & '', & ' 0 <= aimag(acosh(x)) <= PI', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_acosh', & ' use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32', & ' implicit none', & ' real(kind=dp), dimension(3) :: x = [ 1.0_dp, 2.0_dp, 3.0_dp ]', & ' if( any(x.lt.1) )then', & ' write (*,*) '' warning: values < 1 are present''', & ' endif', & ' write (*,*) acosh(x)', & ' end program demo_acosh', & '', & ' Results:', & '', & ' > 0.0000000000000000 1.3169578969248166 1.7627471740390861', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' Inverse function: COSH(3)', & '', & 'RESOURCES', & ' o Wikipedia:hyperbolic functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 acosh(3fortran)', & ''] shortname="acosh" call process() case('6','acospi') textblock=[character(len=256) :: & '', & 'acospi(3fortran) acospi(3fortran)', & '', & 'NAME', & ' ACOSPI(3) - [MATHEMATICS:TRIGONOMETRIC] Circular Arccosine (inverse circular', & ' cosine) function', & '', & 'SYNOPSIS', & ' result = acospi(x)', & '', & ' elemental real(kind=KIND) function acospi(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o KIND may be any real kind', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' ACOSPI(3) computes the circular arccosine of X (inverse of COSPI(X)). The', & ' result is expressed in half-revolutions (ie. PI''s) and lies in the range', & '', & ' 0 <= ACOSPI (X) <= 1.', & '', & 'OPTIONS', & ' o X : The value to compute the circular arctangent of. The value must', & ' satisfy |X| <= 1.', & '', & 'RESULT', & ' The result has a value equal to a processor-dependent approximation to the', & ' arc cosine of X.', & '', & ' The return value is of the same type and kind as X.', & '', & ' It is expressed in half-revolutions and lies in the range 0 <= ACOSPI (X) <=', & ' 1.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_acospi', & ' use, intrinsic :: iso_fortran_env, only : real32,real64,real128', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' real(kind=real64) :: x , d2r', & ' real(kind=real64),parameter :: &', & ' & PI = 3.14159265358979323846264338327950288419716939937510_real64', & '', & ' ! basics', & ' x = PI/4.0_real64', & ' print all,''acospi('',x,'') is '', acospi(x)', & '', & ' ! acospi(-1) should be PI', & ' write(*,*) acospi(-1.0_real64)', & ' d2r=acospi(-1.0_real64)/180.0_real64', & ' print all,''90 degrees is '', d2r*90.0_real64, '' radians''', & ' ! elemental', & ' print all,''elemental'',acospi([-1.0,-0.5,0.0,0.50,1.0])', & ' !', & ' print *,''-1.0'',acospi( -1.0 )', & ' print *,'' 0.0'',acospi( 0.0 )', & ' print *,'' 1.0'',acospi( 1.0 )', & '', & ' end program demo_acospi', & '', & ' Results:', & '', & ' > acospi( 0.78539816339744828 ) is 0.21245823046654463', & ' > 1.0000000000000000', & ' > 90 degrees is 0.50000000000000000 radians', & ' > elemental 1.00000000 0.666666687 0.500000000 0.333333343 0.00000000', & ' > -1.0 1.00000000', & ' > 0.0 0.500000000', & ' > 1.0 0.00000000', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' o arc cosine in radians: ACOS(3)', & '', & ' o arc cosine in degrees: ACOSD(3)', & '', & ' o Inverse function: COS(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 acospi(3fortran)', & ''] shortname="acospi" call process() case('7','adjustl') textblock=[character(len=256) :: & '', & 'adjustl(3fortran) adjustl(3fortran)', & '', & 'NAME', & ' ADJUSTL(3) - [CHARACTER:WHITESPACE] Left-justify a string', & '', & 'SYNOPSIS', & ' result = adjustl(string)', & '', & ' elemental character(len=len(string),kind=KIND) function adjustl(string)', & '', & ' character(len=*,kind=KIND),intent(in) :: string', & '', & 'CHARACTERISTICS', & ' o STRING is a character variable of any supported kind', & '', & ' o The return value is a character variable of the same kind and length as', & ' STRING', & '', & 'DESCRIPTION', & ' ADJUSTL(3) will left-justify a string by removing leading spaces. Spaces are', & ' inserted at the end of the string as needed.', & '', & 'OPTIONS', & ' o STRING : the string to left-justify', & '', & 'RESULT', & ' A copy of STRING where leading spaces are removed and the same number of', & ' spaces are inserted on the end of STRING.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_adjustl', & ' implicit none', & ' character(len=20) :: str = '' sample string''', & ' character(len=:),allocatable :: astr', & ' integer :: length', & '', & ' ! basic use', & ' write(*,''(a,"[",a,"]")'') ''original: '',str', & ' str=adjustl(str)', & ' write(*,''(a,"[",a,"]")'') ''adjusted: '',str', & '', & ' ! a fixed-length string can be printed', & ' ! trimmed using trim(3) or len_trim(3)', & ' write(*,''(a,"[",a,"]")'') ''trimmed: '',trim(str)', & ' length=len_trim(str)', & ' write(*,''(a,"[",a,"]")'') ''substring:'',str(:length)', & '', & ' ! note an allocatable string stays the same length too', & ' ! and is not trimmed by just an adjustl(3) call.', & ' astr='' allocatable string ''', & ' write(*,''(a,"[",a,"]")'') ''original:'',astr', & ' astr = adjustl(astr)', & ' write(*,''(a,"[",a,"]")'') ''adjusted:'',astr', & ' ! trim(3) can be used to change the length', & ' astr = trim(astr)', & ' write(*,''(a,"[",a,"]")'') ''trimmed: '',astr', & '', & ' end program demo_adjustl', & '', & ' Results:', & '', & ' > original: [ sample string ]', & ' > adjusted: [sample string ]', & ' > trimmed: [sample string]', & ' > substring:[sample string]', & ' > original:[ allocatable string ]', & ' > adjusted:[allocatable string ]', & ' > trimmed: [allocatable string]', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' ADJUSTR(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 adjustl(3fortran)', & ''] shortname="adjustl" call process() case('8','adjustr') textblock=[character(len=256) :: & '', & 'adjustr(3fortran) adjustr(3fortran)', & '', & 'NAME', & ' ADJUSTR(3) - [CHARACTER:WHITESPACE] Right-justify a string', & '', & 'SYNOPSIS', & ' result = adjustr(string)', & '', & ' elemental character(len=len(string),kind=KIND) function adjustr(string)', & '', & ' character(len=*,kind=KIND),intent(in) :: string', & '', & 'CHARACTERISTICS', & ' o STRING is a character variable', & '', & ' o The return value is a character variable of the same kind and length as', & ' STRING', & '', & 'DESCRIPTION', & ' ADJUSTR(3) right-justifies a string by removing trailing spaces. Spaces are', & ' inserted at the start of the string as needed to retain the original length.', & '', & 'OPTIONS', & ' o STRING : the string to right-justify', & '', & 'RESULT', & ' Trailing spaces are removed and the same number of spaces are inserted at', & ' the start of STRING.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_adjustr', & ' implicit none', & ' character(len=20) :: str', & ' ! print a short number line', & ' write(*,''(a)'')repeat(''1234567890'',2)', & '', & ' ! basic usage', & ' str = '' sample string ''', & ' write(*,''(a)'') str', & ' str = adjustr(str)', & ' write(*,''(a)'') str', & '', & ' !', & ' ! elemental', & ' !', & ' write(*,''(a)'')repeat(''1234567890'',5)', & ' write(*,''(a)'')adjustr([character(len=50) :: &', & ' '' first '', &', & ' '' second '', &', & ' '' third '' ])', & ' write(*,''(a)'')repeat(''1234567890'',5)', & '', & ' end program demo_adjustr', & '', & ' Results:', & '', & ' > 12345678901234567890', & ' > sample string', & ' > sample string', & ' > 12345678901234567890123456789012345678901234567890', & ' > first', & ' > second', & ' > third', & ' > 12345678901234567890123456789012345678901234567890', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' ADJUSTL(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 adjustr(3fortran)', & ''] shortname="adjustr" call process() case('9','aimag') textblock=[character(len=256) :: & '', & 'aimag(3fortran) aimag(3fortran)', & '', & 'NAME', & ' AIMAG(3) - [TYPE:CONVERSION] Imaginary part of complex number', & '', & 'SYNOPSIS', & ' result = aimag(z)', & '', & ' elemental function aimag(z)', & '', & ' complex(kind=KIND) aimag', & ' complex(kind=KIND),intent(in) :: z', & '', & 'CHARACTERISTICS', & ' o The type of the argument Z is complex. It may be of any supported complex', & ' kind', & '', & ' o The return value is of type real with the kind type parameter of the', & ' argument Z.', & '', & 'DESCRIPTION', & ' AIMAG(3) yields the imaginary part of the complex argument Z.', & '', & ' This is similar to the modern complex-part-designator %IM which also', & ' designates the imaginary part of a value, accept a designator is treated as', & ' a variable. This means it may appear on the left-hand side of an assignment', & ' as well, as in VAL%IM=10.0 or as an argument in a procedure call that will', & ' act as a typical variable passed by reference.', & '', & 'OPTIONS', & ' o Z : The complex value to extract the imaginary component of.', & '', & 'RESULT', & ' The return value is a real value with the magnitude and sign of the', & ' imaginary component of the argument Z.', & '', & ' That is, If Z has the value (X,Y), the result has the value Y.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_aimag', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' character(len=*),parameter :: it=''(*(1x,g0))''', & ' integer :: i', & ' complex :: z4', & ' complex :: arr(3)', & ' complex(kind=real64) :: z8', & '', & ' print it, ''basics:''', & '', & ' z4 = cmplx(1.e0, 2.e0)', & ' print *, ''value='',z4', & ' print it, ''imaginary part='',aimag(z4),''or'', z4%im', & '', & ' print it, ''kinds other than the default may be supported''', & '', & ' z8 = cmplx(3.e0_real64, 4.e0_real64,kind=real64)', & ' print *, ''value='',z8', & ' print it, ''imaginary part='',aimag(z8),''or'', z8%im', & '', & ' print it, ''an elemental function can be passed an array''', & ' print it, ''given a complex array:''', & '', & ' arr=[z4,z4/2.0,z4+z4]', & ' print *, (arr(i),new_line(''a''),i=1,size(arr))', & ' print it, ''the imaginary component is:''', & ' print it, aimag( arr )', & '', & ' end program demo_aimag', & '', & ' Results:', & '', & ' > basics:', & ' > value= (1.00000000,2.00000000)', & ' > imaginary part= 2.00000000 or 2.00000000', & ' > kinds other than the default may be supported', & ' > value= (3.0000000000000000,4.0000000000000000)', & ' > imaginary part= 4.0000000000000000 or 4.0000000000000000', & ' > an elemental function can be passed an array', & ' > given a complex array:', & ' > (1.00000000,2.00000000)', & ' > (0.500000000,1.00000000)', & ' > (2.00000000,4.00000000)', & ' >', & ' > the imaginary component is:', & ' > 2.00000000 1.00000000 4.00000000', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o CMPLX(3) - Complex conversion function', & '', & ' o CONJG(3) - Complex conjugate function', & '', & ' o REAL(3) - Convert to real type', & '', & ' Fortran has strong support for complex values, including many intrinsics', & ' that take or produce complex values in addition to algebraic and logical', & ' expressions:', & '', & ' ABS(3), ACOSH(3), ACOS(3), ASINH(3), ASIN(3), ATAN2(3), ATANH(3), ATAN(3),', & ' COSH(3), COS(3), CO_SUM(3), DBLE(3), DOT_PRODUCT(3), EXP(3), INT(3),', & ' IS_CONTIGUOUS(3), KIND(3), LOG(3), MATMUL(3), PRECISION(3), PRODUCT(3),', & ' RANGE(3), RANK(3), SINH(3), SIN(3), SQRT(3), STORAGE_SIZE(3), SUM(3),', & ' TANH(3), TAN(3), UNPACK(3),', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 aimag(3fortran)', & ''] shortname="aimag" call process() case('10','aint') textblock=[character(len=256) :: & '', & 'aint(3fortran) aint(3fortran)', & '', & 'NAME', & ' AINT(3) - [NUMERIC] Truncate toward zero to a whole number', & '', & 'SYNOPSIS', & ' result = aint(x [,kind])', & '', & ' elemental real(kind=KIND) function iaint(x,KIND)', & '', & ' real(kind=**),intent(in) :: x', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o the result is a real of the default kind unless KIND is specified.', & '', & ' o KIND is an integer initialization expression indicating the kind', & ' parameter of the result.', & '', & 'DESCRIPTION', & ' AINT(3) truncates its argument toward zero to a whole number.', & '', & 'OPTIONS', & ' o X : the real value to truncate.', & '', & ' o KIND : indicates the kind parameter of the result.', & '', & 'RESULT', & ' The sign is the same as the sign of X unless the magnitude of X is less than', & ' one, in which case zero is returned.', & '', & ' Otherwise AINT(3) returns the largest whole number that does not exceed the', & ' magnitude of X with the same sign as the input.', & '', & ' That is, it truncates the value towards zero.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_aint', & ' use, intrinsic :: iso_fortran_env, only : sp=>real32, dp=>real64', & ' implicit none', & ' real(kind=dp) :: x8', & ' print *,''basics:''', & ' print *,'' just chops off the fractional part''', & ' print *, aint(-2.999), aint(-2.1111)', & ' print *,'' if |x| < 1 a positive zero is returned''', & ' print *, aint(-0.999), aint( 0.9999)', & ' print *,'' input may be of any real kind''', & ' x8 = 4.3210_dp', & ' print *, aint(-x8), aint(x8)', & ' print *,''elemental:''', & ' print *,aint([ &', & ' & -2.7, -2.5, -2.2, -2.0, -1.5, -1.0, -0.5, &', & ' & 0.0, &', & ' & +0.5, +1.0, +1.5, +2.0, +2.2, +2.5, +2.7 ])', & ' end program demo_aint', & '', & ' Results:', & '', & ' > basics:', & ' > just chops off the fractional part', & ' > -2.000000 -2.000000', & ' > if |x| < 1 a positive zero is returned', & ' > 0.0000000E+00 0.0000000E+00', & ' > input may be of any real kind', & ' > -4.00000000000000 4.00000000000000', & ' > elemental:', & ' > -2.000000 -2.000000 -2.000000 -2.000000 -1.000000', & ' > -1.000000 0.0000000E+00 0.0000000E+00 0.0000000E+00 1.000000', & ' > 1.000000 2.000000 2.000000 2.000000 2.000000', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' ANINT(3), INT(3), NINT(3), SELECTED_INT_KIND(3), CEILING(3), FLOOR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 aint(3fortran)', & ''] shortname="aint" call process() case('11','all') textblock=[character(len=256) :: & '', & 'all(3fortran) all(3fortran)', & '', & 'NAME', & ' ALL(3) - [ARRAY:REDUCTION] Determines if all the values are true', & '', & 'SYNOPSIS', & ' result = all(mask [,dim])', & '', & ' function all(mask ,dim)', & '', & ' logical(kind=KIND),intent(in) :: mask(..)', & ' integer,intent(in),optional :: dim', & ' logical(kind=KIND) :: all(..)', & '', & 'CHARACTERISTICS', & ' o MASK is a logical array', & '', & ' o DIM is an integer', & '', & ' o the result is a logical array if DIM is supplied, otherwise it is a', & ' logical scalar. It has the same characteristics as MASK', & '', & 'DESCRIPTION', & ' ALL(3) determines if all the values are true in MASK in the array along', & ' dimension DIM if DIM is specified; otherwise all elements are tested', & ' together.', & '', & ' This testing type is called a logical conjunction of elements of MASK along', & ' dimension DIM.', & '', & ' The mask is generally a logical expression, allowing for comparing arrays', & ' and many other common operations.', & '', & 'OPTIONS', & ' o MASK : the logical array to be tested for all elements being .true.', & '', & ' o DIM : DIM indicates the direction through the elements of MASK to group', & ' elements for testing. : DIM has a value that lies between one and the', & ' rank of MASK. The corresponding actual argument shall not be an optional', & ' dummy argument. : If DIM is not present all elements are tested and a', & ' single scalar value is returned.', & '', & 'RESULT', & ' 1. If DIM is not present ALL(MASK) is .true. if all elements of MASK are', & ' .true.. It also is .true. if MASK has zero size; otherwise, it is', & ' .false. .', & '', & ' 2. If the rank of MASK is one, then ALL(MASK, DIM) is equivalent to', & ' ALL(MASK).', & '', & ' 3. If the rank of MASK is greater than one and DIM is present then', & ' ALL(MASK,DIM) returns an array with the rank (number of dimensions) of', & ' MASK minus 1. The shape is determined from the shape of MASK where the', & ' DIM dimension is elided. A value is returned for each set of elements', & ' along the DIM dimension.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_all', & ' implicit none', & ' logical,parameter :: T=.true., F=.false.', & ' logical bool', & '', & ' ! basic usage', & ' ! is everything true?', & ' bool = all([ T,T,T ])', & ' print *, ''are all values true?'', bool', & ' bool = all([ T,F,T ])', & ' print *, ''are all values true now?'', bool', & '', & ' ! compare matrices, even by a dimension', & ' ARRAYS: block', & ' integer :: a(2,3), b(2,3)', & ' ! set everything to one except one value in b', & ' a = 1', & ' b = 1', & ' b(2,2) = 2', & ' ! now compare those two arrays', & ' print *,''entire array :'', all(a == b )', & ' print *,''compare columns:'', all(a == b, dim=1)', & ' print *,''compare rows:'', all(a == b, dim=2)', & ' end block ARRAYS', & '', & ' end program demo_all', & '', & ' Results:', & '', & ' > T', & ' > F', & ' > entire array : F', & ' > compare columns: T F T', & ' > compare rows: T F', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' ANY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 all(3fortran)', & ''] shortname="all" call process() case('12','allocated') textblock=[character(len=256) :: & '', & 'allocated(3fortran) allocated(3fortran)', & '', & 'NAME', & ' ALLOCATED(3) - [ARRAY:INQUIRY] Allocation status of an allocatable entity', & '', & 'SYNOPSIS', & ' result = allocated(array|scalar)', & '', & ' logical function allocated(array,scalar)', & '', & ' type(TYPE(kind=**)),allocatable,optional :: array(..)', & ' type(TYPE(kind=**)),allocatable,optional :: scalar', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o ARRAY may be any allocatable array object of any type.', & '', & ' o SCALAR may be any allocatable scalar of any type.', & '', & ' o the result is a default logical scalar', & '', & 'DESCRIPTION', & ' ALLOCATED(3) checks the allocation status of both arrays and scalars.', & '', & ' At least one and only one of ARRAY or SCALAR must be specified.', & '', & 'OPTIONS', & ' o ENTITY : the allocatable object to test.', & '', & 'RESULT', & ' If the argument is allocated then the result is .true.; otherwise, it', & ' returns .false..', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_allocated', & ' use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32', & ' implicit none', & ' real(kind=sp), allocatable :: x(:)', & ' character(len=256) :: message', & ' integer :: istat', & ' ! basics', & ' if( allocated(x)) then', & ' write(*,*)''do things if allocated''', & ' else', & ' write(*,*)''do things if not allocated''', & ' endif', & '', & ' ! if already allocated, deallocate', & ' if ( allocated(x) ) deallocate(x,STAT=istat, ERRMSG=message )', & ' if(istat.ne.0)then', & ' write(*,*)trim(message)', & ' stop', & ' endif', & '', & ' ! only if not allocated, allocate', & ' if ( .not. allocated(x) ) allocate(x(20))', & '', & ' ! allocation and intent(out)', & ' call intentout(x)', & ' write(*,*)''note it is deallocated!'',allocated(x)', & '', & ' contains', & '', & ' subroutine intentout(arr)', & ' ! note that if arr has intent(out) and is allocatable,', & ' ! arr is deallocated on entry', & ' real(kind=sp),intent(out),allocatable :: arr(:)', & ' write(*,*)''note it was allocated in calling program'',allocated(arr)', & ' end subroutine intentout', & '', & ' end program demo_allocated', & '', & ' Results:', & '', & ' > do things if not allocated', & ' > note it was allocated in calling program F', & ' > note it is deallocated! F', & '', & 'STANDARD', & ' Fortran 95. allocatable scalar entities were added in Fortran 2003.', & '', & 'SEE ALSO', & ' MOVE_ALLOC(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 allocated(3fortran)', & ''] shortname="allocated" call process() case('13','anint') textblock=[character(len=256) :: & '', & 'anint(3fortran) anint(3fortran)', & '', & 'NAME', & ' ANINT(3) - [NUMERIC] Real nearest whole number', & '', & 'SYNOPSIS', & ' result = anint(a [,kind])', & '', & ' elemental real(kind=KIND) function anint(x,KIND)', & '', & ' real(kind=**),intent(in) :: x', & ' integer,intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o A is type real of any kind', & '', & ' o KIND is a scalar integer constant expression.', & '', & ' o the result is type real. The kind of the result is the same as X unless', & ' specified by KIND.', & '', & 'DESCRIPTION', & ' ANINT(3) rounds its argument to the nearest whole number.', & '', & ' Unlike NINT(3) which returns an integer the full range or real values can be', & ' returned (integer types typically have a smaller range of values than real', & ' types).', & '', & 'OPTIONS', & ' o A : the value to round', & '', & ' o KIND : specifies the kind of the result. The default is the kind of A.', & '', & 'RESULT', & ' The return value is the real whole number nearest A.', & '', & ' If A is greater than zero, ANINT(A)(3) returns AINT(A + 0.5).', & '', & ' If A is less than or equal to zero then it returns AINT(A - 0.5), except', & ' AINT specifies that for |A| < 1 the result is zero (0).', & '', & ' It is processor-dependent whether anint(a) returns negative zero when -0.5 <', & ' a <= -0.0. Compiler switches are often available which enable or disable', & ' support of negative zero.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_anint', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real,allocatable :: arr(:)', & '', & ' ! basics', & ' print *, ''ANINT (2.783) has the value 3.0 =>'', anint(2.783)', & ' print *, ''ANINT (-2.783) has the value -3.0 =>'', anint(-2.783)', & '', & ' print *, ''by default the kind of the output is the kind of the input''', & ' print *, anint(1234567890.1234567890e0)', & ' print *, anint(1234567890.1234567890d0)', & '', & ' print *, ''sometimes specifying the result kind is useful when passing''', & ' print *, ''results as an argument, for example.''', & ' print *, ''do you know why the results are different?''', & ' print *, anint(1234567890.1234567890,kind=real64)', & ' print *, anint(1234567890.1234567890d0,kind=real64)', & '', & ' ! elemental', & ' print *, ''numbers on a cusp are always the most troublesome''', & ' print *, anint([ -2.7, -2.5, -2.2, -2.0, -1.5, -1.0, -0.5, 0.0 ])', & '', & ' print *, ''negative zero is processor dependent''', & ' arr=[ 0.0, 0.1, 0.5, 1.0, 1.5, 2.0, 2.2, 2.5, 2.7 ]', & ' print *, anint(arr)', & ' arr=[ -0.0, -0.1, -0.5, -1.0, -1.5, -2.0, -2.2, -2.5, -2.7 ]', & ' print *, anint(arr)', & '', & ' end program demo_anint', & '', & ' Results:', & '', & ' > ANINT (2.783) has the value 3.0 => 3.000000', & ' > ANINT (-2.783) has the value -3.0 => -3.000000', & ' > by default the kind of the output is the kind of the input', & ' > 1.2345679E+09', & ' > 1234567890.00000', & ' > sometimes specifying the result kind is useful when passing', & ' > results as an argument, for example.', & ' > do you know why the results are different?', & ' > 1234567936.00000', & ' > 1234567890.00000', & ' > numbers on a cusp are always the most troublesome', & ' > -3.000000 -3.000000 -2.000000 -2.000000 -2.000000', & ' > -1.000000 -1.000000 0.0000000E+00', & ' > negative zero is processor dependent', & ' > 0.0000000E+00 0.0000000E+00 1.000000 1.000000 2.000000', & ' > 2.000000 2.000000 3.000000 3.000000', & ' > 0.0000000E+00 0.0000000E+00 -1.000000 -1.000000 -2.000000', & ' > -2.000000 -2.000000 -3.000000 -3.000000', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' AINT(3), INT(3), NINT(3), SELECTED_INT_KIND(3), CEILING(3), FLOOR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 anint(3fortran)', & ''] shortname="anint" call process() case('14','any') textblock=[character(len=256) :: & '', & 'any(3fortran) any(3fortran)', & '', & 'NAME', & ' ANY(3) - [ARRAY:REDUCTION] Determines if any of the values in the logical', & ' array are .true.', & '', & 'SYNOPSIS', & ' result = any(mask [,dim])', & '', & ' function any(mask, dim)', & '', & ' logical(kind=KIND),intent(in) :: mask(..)', & ' integer,intent(in),optional :: dim', & ' logical(kind=KIND) :: any(..)', & '', & 'CHARACTERISTICS', & ' o MASK is a logical array', & '', & ' o DIM is a scalar integer', & '', & ' o the result is a logical array if DIM is supplied, otherwise it is a', & ' logical scalar.', & '', & 'DESCRIPTION', & ' ANY(3) determines if any of the values in the logical array MASK along', & ' dimension DIM are .true..', & '', & 'OPTIONS', & ' o MASK : an array of logical expressions or values to be tested in groups', & ' or in total for a .true. value.', & '', & ' o DIM : a whole number value that lies between one and RANK(MASK) that', & ' indicates to return an array of values along the indicated dimension', & ' instead of a scalar answer.', & '', & 'RESULT', & ' ANY(MASK) returns a scalar value of type logical where the kind type', & ' parameter is the same as the kind type parameter of MASK. If DIM is present,', & ' then ANY(MASK, DIM) returns an array with the rank of MASK minus 1. The', & ' shape is determined from the shape of MASK where the DIM dimension is', & ' elided.', & '', & ' 1. ANY(MASK) is .true. if any element of MASK is .true.; otherwise, it is', & ' .false.. It also is .false. if MASK has zero size.', & '', & ' 2. If the rank of MASK is one, then ANY(MASK, DIM) is equivalent to', & ' ANY(MASK). If the rank is greater than one, then ANY(MASK, DIM) is', & ' determined by applying ANY(MASK) to the array sections.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_any', & ' implicit none', & ' logical,parameter :: T=.true., F=.false.', & ' integer :: a(2,3), b(2,3)', & ' logical :: bool', & ' ! basic usage', & ' bool = any([F,F,T,F])', & ' print *,bool', & ' bool = any([F,F,F,F])', & ' print *,bool', & ' ! fill two integer arrays with values for testing', & ' a = 1', & ' b = 1', & ' b(:,2) = 2', & ' b(:,3) = 3', & ' ! using any(3) with logical expressions you can compare two arrays', & ' ! in a myriad of ways', & ' ! first, print where elements of b are bigger than in a', & ' call printl( ''first print b > a '', b > a )', & ' ! now use any() to test', & ' call printl( ''any true values? any(b > a) '', any(b > a ) )', & ' call printl( ''again by columns? any(b > a,1)'', any(b > a, 1) )', & ' call printl( ''again by rows? any(b > a,2)'', any(b > a, 2) )', & ' contains', & ' ! CONVENIENCE ROUTINE. this is not specific to ANY()', & ' subroutine printl(title,a)', & ' use, intrinsic :: iso_fortran_env, only : &', & ' & stderr=>ERROR_UNIT,&', & ' & stdin=>INPUT_UNIT,&', & ' & stdout=>OUTPUT_UNIT', & ' implicit none', & '', & ' !@(#) print small 2d logical scalar, vector, or matrix', & '', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' character(len=*),parameter :: row=''(" > [ ",*(l1:,","))''', & ' character(len=*),intent(in) :: title', & ' logical,intent(in) :: a(..)', & ' integer :: i', & ' write(*,*)', & ' write(*,all,advance=''no'')trim(title),&', & ' & '' : shape='',shape(a),'',rank='',rank(a),'',size='',size(a)', & ' ! get size and shape of input', & ' select rank(a)', & ' rank (0); write(*,''(a)'')''(a scalar)''', & ' write(*,fmt=row,advance=''no'')a', & ' write(*,''(" ]")'')', & ' rank (1); write(*,''(a)'')''(a vector)''', & ' do i=1,size(a)', & ' write(*,fmt=row,advance=''no'')a(i)', & ' write(*,''(" ]")'')', & ' enddo', & ' rank (2); write(*,''(a)'')''(a matrix) ''', & ' do i=1,size(a,dim=1)', & ' write(*,fmt=row,advance=''no'')a(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & ' rank default', & ' write(stderr,*)''*printl* did not expect rank='', rank(a), &', & ' & ''shape='', shape(a),''size='',size(a)', & ' stop ''*printl* unexpected rank''', & ' end select', & '', & ' end subroutine printl', & '', & ' end program demo_any', & '', & ' Results:', & '', & ' > T', & ' > F', & ' >', & ' > first print b > a : shape=23,rank=2,size=6(a matrix)', & ' > > [ F,T,T ]', & ' > > [ F,T,T ]', & ' >', & ' > any true values? any(b > a) : shape=,rank=0,size=1(a scalar)', & ' > > [ T ]', & ' >', & ' > again by columns? any(b > a,1) : shape=3,rank=1,size=3(a vector)', & ' > > [ F ]', & ' > > [ T ]', & ' > > [ T ]', & ' >', & ' > again by rows? any(b > a,2) : shape=2,rank=1,size=2(a vector)', & ' > > [ T ]', & ' > > [ T ]', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' ALL(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 any(3fortran)', & ''] shortname="any" call process() case('15','asin') textblock=[character(len=256) :: & '', & 'asin(3fortran) asin(3fortran)', & '', & 'NAME', & ' ASIN(3) - [MATHEMATICS:TRIGONOMETRIC] Arcsine function', & '', & 'SYNOPSIS', & ' result = asin(x)', & '', & ' elemental TYPE(kind=KIND) function asin(x)', & '', & ' TYPE(kind=KIND) :: x', & '', & 'CHARACTERISTICS', & ' o TYPE may be real or complex', & '', & ' o KIND may be any kind supported by the associated type.', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' ASIN(3) computes the arcsine of its argument X.', & '', & ' The arcsine is the inverse function of the sine function. It is commonly', & ' used in trigonometry when trying to find the angle when the lengths of the', & ' hypotenuse and the opposite side of a right triangle are known.', & '', & 'OPTIONS', & ' o X : The value to compute the arcsine of The type shall be either real and', & ' a magnitude that is less than or equal to one; or be complex.', & '', & 'RESULT', & ' The result has a value equal to a processor-dependent approximation to', & ' arcsin(x).', & '', & ' If X is real the result is real and it is expressed in radians and lies in', & ' the range', & '', & ' PI/2 <= ASIN (X) <= PI/2.', & '', & ' If the argument (and therefore the result) is imaginary the real part of the', & ' result is in radians and lies in the range', & '', & ' -PI/2 <= real(asin(x)) <= PI/2', & '', & 'EXAMPLES', & ' The arcsine will allow you to find the measure of a right angle when you', & ' know the ratio of the side opposite the angle to the hypotenuse.', & '', & ' So if you knew that a train track rose 1.25 vertical miles on a track that', & ' was 50 miles long, you could determine the average angle of incline of the', & ' track using the arcsine. Given', & '', & ' sin(theta) = 1.25 miles/50 miles (opposite/hypotenuse)', & '', & ' Sample program:', & '', & ' program demo_asin', & ' use, intrinsic :: iso_fortran_env, only : dp=>real64', & ' implicit none', & ' ! value to convert degrees to radians', & ' real(kind=dp),parameter :: D2R=acos(-1.0_dp)/180.0_dp', & ' real(kind=dp) :: angle, rise, run', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' ! given sine(theta) = 1.25 miles/50 miles (opposite/hypotenuse)', & ' ! then taking the arcsine of both sides of the equality yields', & ' ! theta = arcsine(1.25 miles/50 miles) ie. arcsine(opposite/hypotenuse)', & ' rise=1.250_dp', & ' run=50.00_dp', & ' angle = asin(rise/run)', & ' print all, ''angle of incline(radians) = '', angle', & ' angle = angle/D2R', & ' print all, ''angle of incline(degrees) = '', angle', & '', & ' print all, ''percent grade='',rise/run*100.0_dp', & ' end program demo_asin', & '', & ' Results:', & '', & ' > angle of incline(radians) = 2.5002604899361139E-002', & ' > angle of incline(degrees) = 1.4325437375665075', & ' > percent grade= 2.5000000000000000', & '', & ' The percentage grade is the slope, written as a percent. To calculate the', & ' slope you divide the rise by the run. In the example the rise is 1.25 mile', & ' over a run of 50 miles so the slope is 1.25/50 = 0.025. Written as a', & ' percent this is 2.5 %.', & '', & ' For the US, two and 1/2 percent is generally thought of as the upper limit.', & ' This means a rise of 2.5 feet when going 100 feet forward. In the US this', & ' was the maximum grade on the first major US railroad, the Baltimore and', & ' Ohio. Note curves increase the frictional drag on a train reducing the', & ' allowable grade.', & '', & 'STANDARD', & ' FORTRAN 77 , for a complex argument Fortran 2008', & '', & 'SEE ALSO', & ' Inverse function: SIN(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 asin(3fortran)', & ''] shortname="asin" call process() case('16','asind') textblock=[character(len=256) :: & '', & 'asind(3fortran) asind(3fortran)', & '', & 'NAME', & ' ASIND(3) - [MATHEMATICS:TRIGONOMETRIC] Arcsine function in degrees', & '', & 'SYNOPSIS', & ' result = asind(x)', & '', & ' elemental real(kind=KIND) function asind(x)', & '', & ' real(kind=KIND) :: x', & '', & 'CHARACTERISTICS', & ' o KIND may be any kind supported by the real type.', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' ASIND(3) computes the arc sine of its argument X in degrees', & '', & ' The arcsine is the inverse function of the sine function. It is commonly', & ' used in trigonometry when trying to find the angle when the lengths of the', & ' hypotenuse and the opposite side of a right triangle are known.', & '', & ' Example: ASIND(1.0) has the value 90.0 (approximately).', & '', & 'OPTIONS', & ' o X : The value to compute the arc sine of The type shall be real and a', & ' magnitude that is less than or equal to one |X| <= 1. It is expressed in', & ' degrees and lies in the range 90 <= asind(x) <= 90.', & '', & 'RESULT', & ' The result has a value equal to a processor-dependent approximation to', & ' arcsin(x).', & '', & ' If X is real the result is real and it is expressed in radians and lies in', & ' the range', & '', & ' PI/2 <= asind (X) <= PI/2.', & '', & ' If the argument (and therefore the result) is imaginary the real part of the', & ' result is in radians and lies in the range', & '', & ' -PI/2 <= real(asind(x)) <= PI/2', & '', & 'EXAMPLES', & ' The arcsine will allow you to find the measure of a right angle when you', & ' know the ratio of the side opposite the angle to the hypotenuse.', & '', & ' So if you knew that a train track rose 1.25 vertical miles on a track that', & ' was 50 miles long, you could determine the average angle of incline of the', & ' track using the arcsine. Given', & '', & ' sin(theta) = 1.25 miles/50 miles (opposite/hypotenuse)', & '', & ' Sample program:', & '', & ' program demo_asind', & ' use, intrinsic :: iso_fortran_env, only : dp=>real64', & ' implicit none', & ' ! value to convert degrees to radians', & ' real(kind=dp),parameter :: R2D=180.0_dp/acos(-1.0_dp)', & ' real(kind=dp) :: angle, rise, run', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' ! given sine(theta) = 1.25 miles/50 miles (opposite/hypotenuse)', & ' ! then taking the arcsine of both sides of the equality yields', & ' ! theta = arcsine(1.25 miles/50 miles) ie. arcsine(opposite/hypotenuse)', & ' rise=1.250_dp', & ' run=50.00_dp', & ' angle = asind(rise/run)', & ' print all, ''angle of incline(degrees) = '', angle', & ' angle = angle/R2D', & ' print all, ''angle of incline(radians) = '', angle', & '', & ' print all, ''percent grade='',rise/run*100.0_dp', & ' contains', & ' subroutine sub1()', & ' ! notice the (incidently empty) type is defined below', & ' ! the implicit statement', & ' implicit type(nil) (a)', & ' type nil', & ' end type nil', & ' type(nil) :: anull', & ' end subroutine sub1', & ' end program demo_asind', & '', & ' Results:', & '', & ' > angle of incline(degrees) = 1.4325437375665075', & ' > angle of incline(radians) = 0.25002604899361135E-1', & ' > percent grade= 2.5000000000000000', & '', & ' The percentage grade is the slope, written as a percent. To calculate the', & ' slope you divide the rise by the run. In the example the rise is 1.25 mile', & ' over a run of 50 miles so the slope is 1.25/50 = 0.025. Written as a', & ' percent this is 2.5 %.', & '', & ' For the US, two and 1/2 percent is generally thought of as the upper limit.', & ' This means a rise of 2.5 feet when going 100 feet forward. In the US this', & ' was the maximum grade on the first major US railroad, the Baltimore and', & ' Ohio. Note curves increase the frictional drag on a train reducing the', & ' allowable grade.', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' Inverse function: SIN(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 asind(3fortran)', & ''] shortname="asind" call process() case('17','asinh') textblock=[character(len=256) :: & '', & 'asinh(3fortran) asinh(3fortran)', & '', & 'NAME', & ' ASINH(3) - [MATHEMATICS:TRIGONOMETRIC] Inverse hyperbolic sine function', & '', & 'SYNOPSIS', & ' result = asinh(x)', & '', & ' elemental TYPE(kind=KIND) function asinh(x)', & '', & ' TYPE(kind=KIND) :: x', & '', & 'CHARACTERISTICS', & ' o X may be any real or complex type', & '', & ' o KIND may be any kind supported by the associated type', & '', & ' o The returned value will be of the same type and kind as the argument', & '', & ' X', & 'DESCRIPTION', & ' ASINH(3) computes the inverse hyperbolic sine of X.', & '', & 'OPTIONS', & ' o X : The value to compute the inverse hyperbolic sine of', & '', & 'RESULT', & ' The result has a value equal to a processor-dependent approximation to the', & ' inverse hyperbolic sine function of X.', & '', & ' If X is complex, the imaginary part of the result is in radians and lies', & ' between', & '', & ' -PI/2 <= aimag(asinh(x)) <= PI/2', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_asinh', & ' use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32', & ' implicit none', & ' real(kind=dp), dimension(3) :: x = [ -1.0d0, 0.0d0, 1.0d0 ]', & '', & ' ! elemental', & ' write (*,*) asinh(x)', & '', & ' end program demo_asinh', & '', & ' Results:', & '', & ' > -0.88137358701954305 0.0000000000000000 0.88137358701954305', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' Inverse function: SINH(3)', & '', & 'RESOURCES', & ' o Wikipedia:hyperbolic functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 asinh(3fortran)', & ''] shortname="asinh" call process() case('18','asinpi') textblock=[character(len=256) :: & '', & 'asinpi(3fortran) asinpi(3fortran)', & '', & 'NAME', & ' ASINPI(3) - [MATHEMATICS:TRIGONOMETRIC] Circular arc sine function', & '', & 'SYNOPSIS', & ' result = asinpi(x)', & '', & ' elemental real(kind=KIND) function asinpi(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o KIND may be any real kind', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' ASINPI(3) computes the arcsine of its argument X.', & '', & ' The arcsine is the inverse function of the sine function. It is commonly', & ' used in trigonometry when trying to find the angle when the lengths of the', & ' hypotenuse and the opposite side of a right triangle are known.', & '', & ' The returned value is in half-revolutions (ie. in multiples of PI).', & '', & ' Example: ASINPI(1:0) has the value 0:5 (approximately).', & '', & 'OPTIONS', & ' o X : The value to compute the arcsine of; where |X| <= 1. The type shall', & ' be real', & '', & 'RESULT', & ' The result has a value equal to a processor-dependent approximation to the', & ' arc sine of X. The result is real and it is expressed in half-revolutions', & ' and lies in the range', & '', & ' -1 <= asinpi (X) <= 1', & '', & ' and is the same kind as the input.', & '', & 'EXAMPLES', & ' The arcsine will allow you to find the measure of a right angle when you', & ' know the ratio of the side opposite the angle to the hypotenuse.', & '', & ' So if you knew that a train track rose 1.25 vertical miles on a track that', & ' was 50 miles long, you could determine the average angle of incline of the', & ' track using the arcsine. Given', & '', & ' sin(theta) = 1.25 miles/50 miles (opposite/hypotenuse)', & '', & ' Sample program:', & '', & ' program demo_asinpi', & ' use, intrinsic :: iso_fortran_env, only : dp=>real64', & ' implicit none', & ' ! value to convert degrees to half-revolutions', & ' real(kind=dp),parameter :: D2HR=1/180.0_dp', & ' real(kind=dp) :: angle, rise, run', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' ! basics', & ' ! elemental', & ' print all, asinpi( [0.0d0, 0.5d0, -0.5d0, 1.0d0, -1.0d0 ])', & ' !', & ' ! sample application', & ' ! given sine(theta) = 1.25 miles/50 miles (opposite/hypotenuse)', & ' ! then taking the arcsine of both sides of the equality yields', & ' ! theta = arcsine(1.25 miles/50 miles) ie. arcsine(opposite/hypotenuse)', & ' rise=1.250_dp', & ' run=50.00_dp', & ' angle = asinpi(rise/run)', & ' print all, ''angle of incline(half-revolutions) = '', angle', & ' angle = angle/D2HR', & ' print all, ''angle of incline(degrees) = '', angle', & ' print all, ''percent grade='',rise/run*100.0_dp', & ' contains', & ' elemental function asinpi(x)', & ' real(kind=dp),parameter :: PI=acos(-1.0_dp)', & ' real(kind=dp),intent(in) :: x', & ' real(kind=dp) :: asinpi', & ' asinpi=asin(x)/PI', & ' end function asinpi', & ' end program demo_asinpi', & '', & ' Results:', & '', & ' > 0.00, 0.166667, -0.166667, 0.50, -0.50', & ' > angle of incline(half-revolutions) = 0.79585763198139307E-2', & ' > angle of incline(degrees) = 1.4325437375665075', & ' > percent grade= 2.5000000000000000', & '', & ' The percentage grade is the slope, written as a percent. To calculate the', & ' slope you divide the rise by the run. In the example the rise is 1.25 mile', & ' over a run of 50 miles so the slope is 1.25/50 = 0.025. Written as a', & ' percent this is 2.5 %.', & '', & ' For the US, two and 1/2 percent is generally thought of as the upper limit.', & ' This means a rise of 2.5 feet when going 100 feet forward. In the US this', & ' was the maximum grade on the first major US railroad, the Baltimore and', & ' Ohio. Note curves increase the frictional drag on a train reducing the', & ' allowable grade.', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' o Inverse function in half-revolutions: SINPI(3)', & '', & ' o function in radians: ASIN(3)', & '', & ' o function in degrees : ASIND(3)', & '', & ' o radians: SIN(3)', & '', & ' o degrees: SIND(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 asinpi(3fortran)', & ''] shortname="asinpi" call process() case('19','associate') textblock=[character(len=256) :: & '', & 'associate(7fortran) associate(7fortran)', & '', & 'NAME', & ' ASSOCIATE(7f) - [EXECUTION CONTROL] aliases selected variable identifiers as', & ' well as creates constants within the block from runtime expressions at entry', & ' into the block (LICENSE:PD)', & '', & 'SYNTAX', & ' Syntax:', & '', & ' [ construct-name : ] ASSOCIATE ( associate-name => selector ...)', & ' :', & ' : the associate-block; zero or more statements or constructs', & ' :', & ' END ASSOCIATE [ construct-name ]', & '', & ' For example:', & '', & ' ! pi is an associate-name, acos(-1.0) is its selector', & ' associate (pi => acos(-1.0) )', & ' print *, pi', & ' end associate', & '', & ' ASSOCIATE-NAME', & '', & ' An identifier that becomes associated with the selector within the', & ' ASSOCIATE block. The "associate-name" must be unique within the', & ' construct (but the name can be redefined in other nested subblocks', & ' such as BLOCK constructs and additional ASSOCIATE blocks).', & '', & ' SELECTOR', & ' Is an expression or variable that will be referred to by the associate-name.', & '', & ' CONSTRUCT-NAME', & '', & ' An optional name for the block. It is generally used so the block', & ' can be exited by name or to distinguish which end statement', & ' is connected with which ASSOCIATE statement when blocks are heavily', & ' nested.', & '', & ' If a construct-name is specified the same name must appear at both', & ' the beginning of the block in the ASSOCIATE statement and at the', & ' end in the END ASSOCIATE statement.', & '', & ' Construct names must be unique in the scoping unit. Once used that', & ' same construct-name must not be used for any other named constructs', & ' in the same scoping unit.', & '', & ' It is permissible to branch to an end-associate-stmt only from', & ' within its ASSOCIATE construct.', & '', & ' MYNAME: associate', & ' :', & ' if(something_is_true) exit MYNAME', & ' :', & ' end associate MYNAME', & '', & ' sample program:', & '', & ' program show_exiting', & ' implicit none', & ' integer :: values(8)', & '', & ' call date_and_time( values=values )', & '', & ' CALENDAR: associate ( cal=values([1,2,3,5,6,7,4]), &', & ' year => VALUES(1), &', & ' month => VALUES(2), &', & ' day => VALUES(3), &', & ' delta_from_UTC_in_minutes => VALUES(4), &', & ' hour_of_day => VALUES(5), &', & ' minutes_of_the_hour => VALUES(6), &', & ' seconds_of_the_minute => VALUES(7), &', & ' milliseconds_of_the_second => VALUES(8) )', & ' if(hour_of_day.lt.6) exit CALENDAR', & ' if(hour_of_day.ge.18) exit CALENDAR', & ' write(*,''(i4.4,"-",i2.2,"-",i2.2,"T", &', & ' & i2.2,":",i2.2,":",i2.2,sp,i0.4)'')cal', & ' end associate CALENDAR', & '', & ' end program show_exiting', & '', & 'DESCRIPTION', & ' An ASSOCIATE statement can rename syntactically complex data selectors with', & ' simple or more descriptive aliases and also allows for simple names to be', & ' used for the value of expressions at the top of the block (this value', & ' becomes a constant in the code block). ASSOCIATE is thus used to make', & ' complicated expressions more readable and maintainable by developers.', & '', & ' The ASSOCIATE construct creates a temporary association between a identifier', & ' and a variable or the value of an expression. The association lasts for the', & ' duration of the block.', & '', & ' Each ASSOCIATE statement must be followed by a matching END ASSOCIATE', & '', & ' The variable will have most, but not all of the attributes of the variable.', & '', & ' More specifically an ASSOCIATE statement either', & '', & ' 1. creates a name for a constant in the block using the value of an', & ' expression defined in the ASSOCIATE statement.', & '', & ' or', & '', & ' 2. creates an alias for a long variable name. When the RHS is a variable', & ' changing the alias value changes the associated name outside of the', & ' block as well.', & '', & ' If the selector of an ASSOCIATE is a variable, the associate-name can be', & ' changed in an ordinary assignment, which also changes the variable.', & '', & ' An alias for a variable is useful when you want to simplify multiple', & ' accesses to a variable that has a lengthy description. An example would be', & ' if the initial variable contains multiple subscripts and component names.', & '', & ' On the other hand an expression (instead of a variable) on the RHS becomes a', & ' named constant in the block.', & '', & ' The ASSOCIATE statement is NOT equivalent to a function statement or a', & ' macro. That would generally be implemented via a contained procedure.', & '', & ' o If the selector is an expression or a variable that has a vector', & ' subscript, the associate-name shall not appear in a variable definition', & ' context but will behave as a constant, much like a parameter of a', & ' procedure with INTENT(IN). That is, the associate-name cannot be changed', & ' in an ordinary assignment.', & '', & ' Note: A vector subscript is an integer array expression of rank one,', & ' designating a sequence of subscripts that correspond to the', & ' values of the elements of the expression.', & '', & ' The sequence does not have to be in order, and may contain', & ' duplicate values:', & '', & ' INTEGER A(10), B(3)', & ' ! B(1) = A(1); B(2) = A(2); B(3) = A(2) also', & ' B = A( [1,2,2] )', & '', & ' o An associate-name shall not be the same as another associate-name in the', & ' same associate-stmt.', & '', & ' o The variable name on the RHS shall not be a coindexed object.', & '', & ' o expr shall not be a variable. Note putting a variable in parentheses', & ' makes it an expression.', & '', & 'EXECUTION OF THE ASSOCIATE CONSTRUCT', & ' Execution of an ASSOCIATE construct causes evaluation of every expression', & ' used as a selector, followed by execution of its block.', & '', & ' During execution of the block within the construct, each associate-name', & ' identifies an entity associated with the corresponding selector.', & '', & ' The associating entity assumes the declared type and type parameters of the', & ' selector.', & '', & ' If and only if the selector is polymorphic, the associating entity is', & ' polymorphic.', & '', & 'ATTRIBUTES OF ASSOCIATE NAMES', & ' Within an ASSOCIATE or SELECT TYPE construct, each associating entity has', & ' the same rank and corank as its associated selector.', & '', & ' The lower bound of each dimension is the result of the intrinsic function', & ' LBOUND(3f) applied to the corresponding dimension of selector. The upper', & ' bound of each dimension is one less than the sum of the lower bound and the', & ' extent.', & '', & ' Sample showing affects on custom bounds:', & '', & ' program show_bounds', & ' implicit none', & ' character(len=*),parameter :: & ! a format', & ' & bounds="(''bounds of '',a,''=>('',i0,'':'',i0,'','',i0,'':'',i0,'')'')"', & ' integer :: arr(-5:5,-5:5) ! custom non-normal bounds', & ' integer :: b(4)', & ' ! first the different between queries of arr versus arr(:,:)', & ' b([1,3,2,4])=[lbound(arr),ubound(arr)]', & ' print bounds,''arr'', b', & ' b([1,3,2,4])=[lbound(arr(:,:)),ubound(arr(:,:))]', & ' print bounds,''arr(:,:)'',b', & ' !', & ' ! and the bounds assigned to the identifiers are what UBOUND(3f)', & ' ! and LBOUND(3f) return given the selector as an argument so', & ' associate ( &', & ' alias=> arr, & ! keeps the custom bounds', & ' normal=> arr(:,:) & ! gets normal bounds', & ' )', & ' b([1,3,2,4])=[lbound(alias),ubound(alias)]', & ' print bounds,''alias'', b', & ' b([1,3,2,4])=[lbound(normal),ubound(normal)]', & ' print bounds,''normal'',b', & ' end associate', & ' end program show_bounds', & '', & ' Results:', & '', & ' bounds of arr=>(-5:5,-5:5)', & ' bounds of arr(:,:)=>(1:11,1:11)', & ' bounds of alias=>(-5:5,-5:5)', & ' bounds of normal=>(1:11,1:11)', & '', & ' The cobounds of each codimension of the associating entity are the same as', & ' those of the selector.', & '', & ' The associating entity has the ASYNCHRONOUS or VOLATILE attribute if and', & ' only if the selector is a variable and has the attribute.', & '', & ' The associating entity has the TARGET attribute if and only if the selector', & ' is a variable and has either the TARGET or POINTER attribute.', & '', & ' The selector must be allocated if allocatable. The associate-name is not', & ' ALLOCATABLE even if the selector is.', & '', & ' If a selector has the POINTER attribute, it shall be associated. The', & ' associate name is associated with the target of the pointer and does not', & ' have the POINTER attribute.', & '', & ' If the associating entity is polymorphic, it assumes the dynamic type and', & ' type parameter values of the selector.', & '', & ' If the selector has the OPTIONAL attribute, it shall be present (It cannot', & ' be absent). The associating entity does not have the OPTIONAL attribute.', & '', & ' The associating entity is contiguous if and only if the selector is', & ' contiguous.', & '', & ' If the selector is not permitted to appear in a variable definition context,', & ' the associate name shall not appear in a variable definition context.', & '', & ' The selector has the TARGET attribute if and only if the selector is a', & ' variable and has either the TARGET or POINTER attribute.', & '', & ' expr shall not be a designator of a procedure pointer or a function', & ' reference that returns a procedure pointer.', & '', & ' Within an ASSOCIATE construct, each associating entity has the same corank', & ' as its associated selector. If the selector is a coarray, the cobounds of', & ' each codimension of the associating entity are the same as those of the', & ' selector.', & '', & ' The associating entity itself is a variable, but if the selector is not a', & ' definable variable, the associating entity is not definable and shall not be', & ' defined or become undefined.', & '', & ' If a selector is not permitted to appear in a variable definition context,', & ' neither the associate name nor any subobject thereof shall appear in a', & ' variable definition context or pointer association context.', & '', & 'NESTING', & ' No other block may be created in an ASSOCIATE block that is not terminated', & ' in the block; and the ASSOCIATE block must be terminated in the block it was', & ' created in. For example, if an ASSOCIATE block is begun in a DO loop it must', & ' be terminated before the end of the loop. Conversely if a DO loop is', & ' created in an ASSOCIATE block it must be terminated before the end of the', & ' ASSOCIATE block.', & '', & ' An associate-name can appear in an ASSOCIATE statement even if it previously', & ' appeared in an ASSOCIATE statement that has not been terminated.', & '', & 'SAMPLES', & ' The following shows association with an array section:', & '', & ' associate (array => ab % d(i, :) % x)', & ' array(3) = array(1) + array(2)', & ' end associate', & '', & ' instead of the equivalent statement', & '', & ' ab % d(i,3) % x = ab % d(i,1) % x + ab % d(i,2) % x', & '', & ' This example illustrates an association with an expression.', & '', & ' associate ( z => exp(-(x**2+y**2)) * cos(theta) )', & ' ! creates the constant "z"', & ' print *, a+z, a-z', & ' end associate', & '', & ' an association with a derived-type variable:', & '', & ' associate ( xc => ax%b(i,j)%c )', & ' xc%dv = xc%dv + product(xc%ev(1:n))', & ' end associate', & '', & ' association with an array section:', & '', & ' associate ( quadrantIII => array(1:5,6:10) )', & ' quadrantIII = 0', & ' end associate', & '', & ' The next example illustrates multiple associations.', & '', & ' associate ( w => result(i,j)%w, &', & ' & zx => ax%b(i,j)%d, &', & ' & zy => ay%b(i,j)%d )', & ' w = zx*x + zy*y', & ' end associate', & '', & ' An ASSOCIATE block may not span other block boundaries', & '', & ' do i=1,3', & ' associate (x => real(i)) !since this was started inside the DO loop', & ' print*,i,sqrt(x)', & ' end associate ! the end must appear before the end of the DO loop', & ' enddo', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_associate', & ' implicit none', & ' character(len=*),parameter :: g=''(*(g0,1x))''', & ' character :: array(-5:5,-5:5) ! custom non-normal bounds', & ' ! note the different between queries of ARRAY versus ARRAY(:,:)', & ' write(*,g)''array: '', ''lbound='',lbound(array), &', & ' ''ubound='',ubound(array)', & ' write(*,g)''array(:,:): '', ''lbound='',lbound(array(:,:)), &', & ' ''ubound='',ubound(array(:,:))', & ' ! the bounds assigned to the identifiers are what UBOUND(3f)', & ' ! and LBOUND(3f) return given the selector as an argument', & ' associate ( &', & ' alias=> array, & ! keeps the custom bounds', & ' normal=> array(:,:), & ! gets normal bounds', & ' quadI=> array(+1:+5,-5:-1), & ! quad* will have normal bounds', & ' quadII=> array(-5:-1,-5:-1), & !', & ' quadIII=> array(-5:-1,+1:+5), & !', & ' quadIV=> array(+1:+5,+1:+5), & !', & ' xaxis=>array(:,0), &', & ' yaxis=>array(0,:) &', & ' )', & ' array=''.'' ! selector name is still valid in the block', & ' xaxis=''-''', & ' yaxis=''|''', & ' alias(0,0)=''+'' ! uses non-normal bounds, equivalent to array(0,0)=''+''', & ' write(*,''(11(g0,1x))'') alias', & ' ! the quads have normalized dimension bounds (1:5,1:5):', & ' quadI = ''1''; quadI(1,1) = ''a''; quadI(5,5) = ''A''', & ' quadII = ''2''; quadII(1,1) = ''b''; quadII(5,5) = ''B''', & ' quadIII = ''3''; quadIII(1,1) = ''c''; quadIII(5,5) = ''C''', & ' quadIV = ''4''; quadIV(1,1) = ''d''; quadIV(5,5) = ''D''', & ' write(*,''(11(g0,1x))'') alias', & ' write(*,g)''array: lbound='',lbound(array), ''ubound='',ubound(array)', & ' write(*,g)''alias: lbound='',lbound(alias), ''ubound='',ubound(alias)', & ' write(*,g)''normal: lbound='',lbound(normal),''ubound='',ubound(normal)', & ' write(*,g)''quadI: lbound='',lbound(quadI), ''ubound='',ubound(quadI)', & ' write(*,g)''quadII: lbound='',lbound(quadII),''ubound='',ubound(quadII)', & ' write(*,g)''quadIV: lbound='',lbound(quadIV),''ubound='',ubound(quadIV)', & ' end associate', & ' end program demo_associate', & '', & ' Results:', & '', & ' array: lbound= -5 -5 ubound= 5 5', & ' array(:,:): lbound= 1 1 ubound= 11 11', & ' . . . . . | . . . . .', & ' . . . . . | . . . . .', & ' . . . . . | . . . . .', & ' . . . . . | . . . . .', & ' . . . . . | . . . . .', & ' - - - - - + - - - - -', & ' . . . . . | . . . . .', & ' . . . . . | . . . . .', & ' . . . . . | . . . . .', & ' . . . . . | . . . . .', & ' . . . . . | . . . . .', & ' b 2 2 2 2 | a 1 1 1 1', & ' 2 2 2 2 2 | 1 1 1 1 1', & ' 2 2 2 2 2 | 1 1 1 1 1', & ' 2 2 2 2 2 | 1 1 1 1 1', & ' 2 2 2 2 B | 1 1 1 1 A', & ' - - - - - + - - - - -', & ' c 3 3 3 3 | d 4 4 4 4', & ' 3 3 3 3 3 | 4 4 4 4 4', & ' 3 3 3 3 3 | 4 4 4 4 4', & ' 3 3 3 3 3 | 4 4 4 4 4', & ' 3 3 3 3 C | 4 4 4 4 D', & ' array: lbound= -5 -5 ubound= 5 5', & ' alias: lbound= -5 -5 ubound= 5 5', & ' normal: lbound= 1 1 ubound= 11 11', & ' quadI: lbound= 1 1 ubound= 5 5', & ' quadII: lbound= 1 1 ubound= 5 5', & ' quadIII: lbound= 1 1 ubound= 5 5', & ' quadIV: lbound= 1 1 ubound= 5 5', & '', & ' Dusty Corners', & '', & ' If the expressions have side-effects are they executed only when the block', & ' is entered?', & '', & ' Selected variable names are still accessible in the ASSOCIATE block. This', & ' is confusing and should be avoided, particular if the selectors are', & ' allocatable or pointers. This is similiar to variables passed as arguments', & ' to contained procedures but referenced via the argument name and the name in', & ' the surrounding scope. The behavior is ill-defined. Does a change to the', & ' argument take affect immediately or upon return from the procedure? If the', & ' argument is not declared allocatable or is a pointer does the argument name', & ' value get changed by deallocation or disassociation or changes to the', & ' original names?', & '', & ' are you allowed to allocate v to a different size before the ASSOCIATE is', & ' terminated? If so, what happens to c ?', & '', & ' Does that mean it is invalid to resize v within the ASSOCIATE block? Or is', & ' it only invalid to resize v and then refer to c? Or only invalid to resize v', & ' and refer to c when c is associated with elements of v that no longer exist?', & '', & ' implicit none', & ' integer, allocatable, target :: v(:)', & ' integer, pointer :: p(:)', & ' v = [4,7,9]', & ' p => v', & ' print*,p', & ' deallocate(v)', & ' print*,p ! invalid, because target has been deallocated', & ' end program main', & '', & ' are you allowed to allocate v to a different size before the ASSOCIATE is', & ' terminated? If so, what happens to c?', & '', & ' program demonstrate_associate', & ' implicit none', & ' integer, allocatable :: v(:)', & ' v = [3,4]', & '', & ' associate (c => v) ; call disp("1",v,c)', & ' c = c*10 ; call disp("2",v,c)', & ' v = [2,4,6] ; call disp("3",v,c)', & ' c = c*10 ; call disp("4",v,c)', & ' v = [2] ; call disp("5",v,c)', & ' end associate', & '', & ' contains', & '', & ' subroutine disp(label,v,c)', & ' character (len=*), intent(in) :: label', & ' integer, intent(in) :: v(:),c(:)', & ' write (*,"(a,'' v = '',*(1x,i0))",advance="no") label,v', & ' write (*,"(3x,''c = '',*(1x,i0))") c', & ' end subroutine disp', & '', & ' end program demonstrate_associate', & '', & 'COMPARISONS TO OTHER CONSTRUCTS', & ' When is it not true that', & '', & ' associate (a=>AA)', & ' end associate', & '', & ' is equivalent to', & '', & ' call assoc(AA)', & ' contains', & ' subroutine assoc(a)', & ' type(type(a)),intent(in) :: a(..) ! if a in an expression', & ' type(type(a)) :: a(..) ! if a in a variable', & ' end subroutine assoc', & ' ! somewhat like the parameters being class(*) but without all the', & ' ! SELECT statements like type(type(a)) worked.', & '', & ' ! so "a" in the subroutine does not have the allocatable, optional,', & ' ! or pointer attributes even if AA did, and it is up to the programmer', & ' ! to make sure AA is allocated or assigned a target or present if', & ' ! optional when making the call if it has those attributes.', & '', & ' ! but it can have the target attribute.', & '', & 'SEE ALSO', & ' o DO(3) - construct', & '', & ' o IF(3) - selects a block based on a sequence of logical expressions.', & '', & ' o CYCLE(3) - construct', & '', & ' o EXIT(3) - statement', & '', & ' o ASSOCIATE(3) - associate construct', & '', & ' o BLOCK(3) - construct', & '', & ' o GOTO(3) - jump to target line', & '', & ' o SELECT(3) - select a block based on the value of an expression (a case)', & '', & ' o CASE(3) - select a block based on the value of an expression (a case)', & '', & ' o ENDSELECT(3) - select a block based on the value of an expression (a', & ' case)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 associate(7fortran)', & ''] shortname="associate" call process() case('20','associated') textblock=[character(len=256) :: & '', & 'associated(3fortran) associated(3fortran)', & '', & 'NAME', & ' ASSOCIATED(3) - [STATE:INQUIRY] Association status of a pointer or', & ' pointer/target pair', & '', & 'SYNOPSIS', & ' result = associated(pointer [,target])', & '', & ' logical function associated(pointer,target)', & '', & ' type(TYPE(kind=KIND)),pointer :: pointer', & ' type(TYPE(kind=KIND)),pointer,optional :: target', & '', & 'CHARACTERISTICS', & ' o POINTER shall have the pointer attribute and it can be any type or may be', & ' a procedure pointer', & '', & ' o TARGET shall be a pointer or a target. It must have the same type, kind', & ' type parameter, and array rank as POINTER.', & '', & ' o The association status of neither POINTER nor TARGET shall be undefined.', & '', & ' o the result is a default logical value', & '', & 'DESCRIPTION', & ' ASSOCIATED(3) determines the status of the pointer POINTER or if POINTER is', & ' associated with the target TARGET.', & '', & 'OPTIONS', & ' o POINTER : A pointer to test for association. Its pointer association', & ' status shall not be undefined.', & '', & ' o TARGET : A target that is to be tested for occupying the same storage', & ' units as the pointer POINTER. That is, it is tested as to whether it is', & ' pointed to by POINTER.', & '', & 'RESULT', & ' ASSOCIATED(3) returns a scalar value of type logical. There are several', & ' cases:', & '', & ' 1. When the optional TARGET is not present then ASSOCIATED(POINTER) is', & ' .true. if POINTER is associated with a target; otherwise, it returns', & ' .false..', & '', & ' 2. If TARGET is present and a scalar target, the result is .true. if TARGET', & ' is not a zero-sized storage sequence and the target associated with', & ' POINTER occupies the same storage units. If POINTER is disassociated,', & ' the result is .false..', & '', & ' 3. If TARGET is present and an array target, the result is .true. if TARGET', & ' and POINTER have the same shape, are not zero-sized arrays, are arrays', & ' whose elements are not zero-sized storage sequences, and TARGET and', & ' POINTER occupy the same storage units in array element order.', & '', & ' As in case 2, the result is .false., if POINTER is disassociated.', & '', & ' 4. If TARGET is present and an scalar pointer, the result is .true. if', & ' TARGET is associated with POINTER, the target associated with TARGET are', & ' not zero-sized storage sequences and occupy the same storage units.', & '', & ' The result is .false., if either TARGET or POINTER is disassociated.', & '', & ' 5. If TARGET is present and an array pointer, the result is .true. if', & ' target associated with POINTER and the target associated with TARGET', & ' have the same shape, are not zero-sized arrays, are arrays whose', & ' elements are not zero-sized storage sequences, and TARGET and POINTER', & ' occupy the same storage units in array element order.', & '', & ' 6. If TARGET is present and is a procedure, the result is true if and only', & ' if POINTER is associated with TARGET and, if TARGET is an internal', & ' procedure, they have the same host instance.', & '', & ' 7. If TARGET is present and is a procedure pointer, the result is true if', & ' and only if POINTER and TARGET are associated with the same procedure', & ' and, if the procedure is an internal procedure, they have the same host', & ' instance.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_associated', & ' implicit none', & ' real, target :: tgt(2) = [1., 2.]', & ' real, pointer :: ptr(:)', & ' ptr => tgt', & ' if (associated(ptr) .eqv. .false.) &', & ' & stop ''POINTER NOT ASSOCIATED''', & ' if (associated(ptr,tgt) .eqv. .false.) &', & ' & stop ''POINTER NOT ASSOCIATED TO TARGET''', & ' if (associated(ptr) ) &', & ' & print *, ''POINTER ASSOCIATED''', & ' if (associated(ptr,tgt) ) &', & ' & print *, ''POINTER ASSOCIATED TO TARGET''', & ' end program demo_associated', & '', & ' Results:', & '', & ' > POINTER ASSOCIATED', & ' > POINTER ASSOCIATED TO TARGET', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' NULL(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 associated(3fortran)', & ''] shortname="associated" call process() case('21','atan2') textblock=[character(len=256) :: & '', & 'atan2(3fortran) atan2(3fortran)', & '', & 'NAME', & ' ATAN2(3) - [MATHEMATICS:TRIGONOMETRIC] Arctangent (inverse tangent) function', & '', & 'SYNOPSIS', & ' result = atan2(y, x)', & '', & ' elemental real(kind=KIND) function atan2(y, x)', & '', & ' real,kind=KIND) :: atan2', & ' real,kind=KIND),intent(in) :: y, x', & '', & 'CHARACTERISTICS', & ' o X and Y must be reals of the same kind.', & '', & ' o The return value has the same type and kind as Y and X.', & '', & 'DESCRIPTION', & ' ATAN2(3) computes in radians a processor-dependent approximation of the', & ' arctangent of the complex number ( X, Y ) or equivalently the principal', & ' value of the arctangent of the value Y/X (which determines a unique angle).', & '', & ' If Y has the value zero, X shall not have the value zero.', & '', & ' The resulting phase lies in the range', & '', & ' -PI <= ATAN2 (Y,X) <= PI', & '', & ' and is equal to a processor-dependent approximation to a value of', & ' arctan(Y/X).', & '', & 'OPTIONS', & ' o Y : The imaginary component of the complex value (X,Y) or the Y component', & ' of the point <X,Y>.', & '', & ' o X : The real component of the complex value (X,Y) or the X component of', & ' the point <X,Y>.', & '', & 'RESULT', & ' The value returned is by definition the principal value of the complex', & ' number (X, Y), or in other terms, the phase of the phasor x+i*y.', & '', & ' The principal value is simply what we get when we adjust a radian value to', & ' lie between -PI and PI inclusive,', & '', & ' The classic definition of the arctangent is the angle that is formed in', & ' Cartesian coordinates of the line from the origin point <0,0> to the point', & ' <X,Y> .', & '', & ' Pictured as a vector it is easy to see that if X and Y are both zero the', & ' angle is indeterminate because it sits directly over the origin, so', & ' ATAN(0.0,0.0) will produce an error.', & '', & ' Range of returned values by quadrant:', & '', & ' > +PI/2', & ' > |', & ' > |', & ' > PI/2 < z < PI | 0 > z < PI/2', & ' > |', & ' > +-PI -------------+---------------- +-0', & ' > |', & ' > PI/2 < -z < PI | 0 < -z < PI/2', & ' > |', & ' > |', & ' > -PI/2', & ' >', & ' NOTES:', & '', & ' If the processor distinguishes -0 and +0 then the sign of the', & ' returned value is that of Y when Y is zero, else when Y is zero', & ' the returned value is always positive.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atan2', & ' real :: z', & ' complex :: c', & ' !', & ' ! basic usage', & ' ! ATAN2 (1.5574077, 1.0) has the value 1.0 (approximately).', & ' z=atan2(1.5574077, 1.0)', & ' write(*,*) ''radians='',z,''degrees='',r2d(z)', & ' !', & ' ! elemental : arrays', & ' write(*,*)''elemental'',atan2( [10.0, 20.0], [30.0,40.0] )', & ' !', & ' ! elemental : arrays and scalars', & ' write(*,*)''elemental'',atan2( [10.0, 20.0], 50.0 )', & ' !', & ' ! break complex values into real and imaginary components', & ' ! (note TAN2() can take a complex type value )', & ' c=(0.0,1.0)', & ' write(*,*)''complex'',c,atan2( x=c%re, y=c%im )', & ' !', & ' ! extended sample converting cartesian coordinates to polar', & ' COMPLEX_VALS: block', & ' real :: ang, radius', & ' complex,allocatable :: vals(:)', & ' integer :: i', & ' !', & ' vals=[ &', & ' ! 0 45 90 135', & ' ( 1.0, 0.0 ), ( 1.0, 1.0 ), ( 0.0, 1.0 ), (-1.0, 1.0 ), &', & ' ! 180 225 270', & ' (-1.0, 0.0 ), (-1.0,-1.0 ), ( 0.0,-1.0 ) ]', & ' do i=1,size(vals)', & ' call cartesian_to_polar(vals(i), radius,ang)', & ' write(*,101)vals(i),ang,r2d(ang),radius', & ' enddo', & ' 101 format( ''X='',f5.2,'' Y='',f5.2,'' ANGLE='',g0, &', & ' & T38,''DEGREES='',g0.4, T54,''DISTANCE='',g0)', & ' endblock COMPLEX_VALS', & ' !', & ' contains', & ' !', & ' elemental real function r2d(radians)', & ' ! input radians to convert to degrees', & ' doubleprecision,parameter :: DEGREE=0.017453292519943d0 ! radians', & ' real,intent(in) :: radians', & ' r2d=radians / DEGREE ! do the conversion', & ' end function r2d', & ' !', & ' subroutine cartesian_to_polar(xy,radius,inclination)', & ' ! return angle in radians in range 0 to 2*PI', & ' implicit none', & ' complex,intent(in) :: xy', & ' real,intent(out) :: radius,inclination', & ' radius=abs( xy )', & ' ! arbitrarily set angle to zero when radius is zero', & ' inclination=merge(0.0,atan2(x=xy%re, y=xy%im),radius==0.0)', & ' ! bring into range 0 <= inclination < 2*PI', & ' if(inclination < 0.0)inclination=inclination+2*atan2(0.0d0,-1.0d0)', & ' end subroutine cartesian_to_polar', & ' !', & ' end program demo_atan2', & '', & ' Results:', & '', & ' > radians= 1.00000000 degrees= 57.2957802', & ' > elemental 0.321750551 0.463647604', & ' > elemental 0.197395563 0.380506366', & ' > complex (0.00000000,1.00000000) 1.57079637', & ' > X= 1.00 Y= 0.00 ANGLE= 0.00000000 DEGREES= 0.000 DISTANCE=1.00000000', & ' > X= 1.00 Y= 1.00 ANGLE= 0.785398185 DEGREES= 45.00 DISTANCE=1.41421354', & ' > X= 0.00 Y= 1.00 ANGLE= 1.57079637 DEGREES= 90.00 DISTANCE=1.00000000', & ' > X=-1.00 Y= 1.00 ANGLE= 2.35619450 DEGREES= 135.0 DISTANCE=1.41421354', & ' > X=-1.00 Y= 0.00 ANGLE= 3.14159274 DEGREES= 180.0 DISTANCE=1.00000000', & ' > X=-1.00 Y=-1.00 ANGLE= 3.92699075 DEGREES= 225.0 DISTANCE=1.41421354', & ' > X= 0.00 Y=-1.00 ANGLE= 4.71238899 DEGREES= 270.0 DISTANCE=1.00000000', & '', & ' # STANDARD', & '', & ' FORTRAN 77', & '', & ' # SEE ALSO', & '', & ' - [**atan**(3)](#atan)', & ' - [**tan**(3)](#tan)', & ' - [**tan2**(3)](#tan2)', & '', & ' # RESOURCES', & '', & ' - [arctan:wikipedia]', & ' (https://en.wikipedia.org/wiki/Inverse_trigonometric_functions)', & ' _Fortran intrinsic descriptions (license: MIT) \@urbanjost_', & '', & ' March 16, 2025 atan2(3fortran)', & ''] shortname="atan2" call process() case('22','atan2d') textblock=[character(len=256) :: & '', & 'atan2d(3fortran) atan2d(3fortran)', & '', & 'NAME', & ' ATAN2D(3) - [MATHEMATICS:TRIGONOMETRIC] Arc tangent function in degrees', & ' (inverse tangent)', & '', & 'SYNOPSIS', & ' result = atan2d(y, x)', & '', & ' elemental real(kind=KIND) function atan2d(y, x)', & '', & ' real,kind=KIND) :: atan2d', & ' real,kind=KIND),intent(in) :: y, x', & '', & 'CHARACTERISTICS', & ' o X and Y must be reals of the same kind.', & '', & ' o The return value has the same type and kind as Y and X.', & '', & 'DESCRIPTION', & ' ATAN2D(3) computes in degrees a processor-dependent approximation of the', & ' arctangent of the principal value of the arctangent of the value Y/X (which', & ' determines a unique angle).', & '', & ' If Y has the value zero, X shall not have the value zero.', & '', & ' The resulting phase lies in the range -180 <= atan2d (Y,X) <= 180 and is', & ' equal to a processor-dependent approximation to a value of arctan(Y/X)', & ' expressed in degrees.', & '', & ' It is equivalent to ATAN2(Y, X)*180/PI but limited to real values.', & '', & 'OPTIONS', & ' o Y : The imaginary component of the complex value (X,Y) or the Y component', & ' of the point <X,Y>.', & '', & ' o X : The real component of the complex value (X,Y) or the X component of', & ' the point <X,Y>.', & '', & 'RESULT', & ' The result is in degrees, not radians.', & '', & ' The radian value is by definition the principal value of the complex number', & ' (X, Y), or in other terms, the phase of the phasor x+i*y.', & '', & ' The principal value is simply what we get when we adjust the value to lie', & ' between -180 and 180 degrees inclusive,', & '', & ' The classic definition of the arctangent is the angle that is formed in', & ' Cartesian coordinates of the line from the origin point <0,0> to the point', & ' <X,Y> .', & '', & ' Pictured as a vector it is easy to see that if X and Y are both zero the', & ' angle is indeterminate because it sits directly over the origin, so', & ' ATAN2D(0.0,0.0) will produce an error.', & '', & ' Range of returned values by quadrant:', & '', & ' > +90', & ' > |', & ' > |', & ' > 90 < z < 180 | 0 > z < 90', & ' > |', & ' > +-180 ------------+---------------- +-0', & ' > |', & ' > 90 < -z < 180 | 0 < -z < 90', & ' > |', & ' > |', & ' > -90', & ' >', & ' NOTES:', & '', & ' If the processor distinguishes -0 and +0 then the sign of the', & ' returned value is that of Y when Y is zero, else when Y is zero', & ' the returned value is always positive.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atan2d', & ' implicit none', & ' integer,parameter :: wp=kind(0.0)', & ' real(wp),parameter :: d2r=acos(-1.0_wp)/180.0_wp', & ' real :: z', & ' complex :: c', & ' !', & ' ! basic usage', & ' ! atan2d (1.5574077, 1.0) has the value 1.0 radian (approximately).', & ' z=atan2d(1.5574077, 1.0)', & ' write(*,*) ''degrees='',z,''radians='',d2r*z', & ' !', & ' ! elemental arrays', & ' write(*,*)''elemental'',atan2d( [10.0, 20.0], [30.0,40.0] )', & ' !', & ' ! elemental arrays and scalars', & ' write(*,*)''elemental'',atan2d( [10.0, 20.0], 50.0 )', & ' !', & ' ! multi-dimensional returns multi-dimensional', & ' write(*,*) atan2(reshape([1.0,1.0,1.0,1.0],[2,2]),&', & ' & reshape([1.0,1.0,1.0,1.0],[2,2]) )', & ' !', & ' ! break complex values into real and imaginary components', & ' c=(0.0,1.0)', & ' write(*,*)''complex value treated as components'', &', & ' & c,atan2d( x=c%re, y=c%im )', & ' !', & ' ! extended sample', & ' COMPLEX_VALS: block', & ' real :: ang', & ' complex,allocatable :: vals(:)', & ' integer :: i', & ' !', & ' vals=[ &', & ' ( 1.0, 0.0 ), & ! 0', & ' ( 1.0, 1.0 ), & ! 45', & ' ( 0.0, 1.0 ), & ! 90', & ' (-1.0, 1.0 ), & ! 135', & ' (-1.0, 0.0 ), & ! 180', & ' (-1.0,-1.0 ), & ! 225', & ' ( 0.0,-1.0 )] ! 270', & ' do i=1,size(vals)', & ' ang=atan2d(vals(i)%im, vals(i)%re)', & ' write(*,101)vals(i),ang,d2r*ang', & ' enddo', & ' 101 format( &', & ' & ''X= '',f5.2, &', & ' & '' Y= '',f5.2, &', & ' & '' ANGLE= '',g0, &', & ' & T38,''RADIANS= '',g0.4)', & ' endblock COMPLEX_VALS', & ' !', & ' end program demo_atan2d', & '', & ' Results:', & '', & ' > degrees= 57.2957802 radians= 1.00000000', & ' > elemental 18.4349480 26.5650520', & ' > elemental 11.3099327 21.8014107', & ' > 0.785398185 0.785398185 0.785398185 0.785398185', & ' > complex value treated as components (0.0000,1.0000) 90.000', & ' > X= 1.00 Y= 0.00 ANGLE= 0.00000000 RADIANS= 0.000', & ' > X= 1.00 Y= 1.00 ANGLE= 45.0000000 RADIANS= 0.7854', & ' > X= 0.00 Y= 1.00 ANGLE= 90.0000000 RADIANS= 1.571', & ' > X= -1.00 Y= 1.00 ANGLE= 135.000000 RADIANS= 2.356', & ' > X= -1.00 Y= 0.00 ANGLE= 180.000000 RADIANS= 3.142', & ' > X= -1.00 Y= -1.00 ANGLE= -135.000000 RADIANS= -2.356', & ' > X= 0.00 Y= -1.00 ANGLE= -90.0000000 RADIANS= -1.571', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' o ATAN(3)', & '', & ' o ATANPI(3)', & '', & 'RESOURCES', & ' o arctan:wikipedia', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 atan2d(3fortran)', & ''] shortname="atan2d" call process() case('23','atan2pi') textblock=[character(len=256) :: & '', & 'atan2pi(3fortran) atan2pi(3fortran)', & '', & 'NAME', & ' ATAN2PI(3) - [MATHEMATICS:TRIGONOMETRIC] Circular Arc tangent (inverse', & ' tangent) function', & '', & 'SYNOPSIS', & ' result = atan2pi(y, x)', & '', & ' elemental real(kind=KIND) function atan2pi(y, x)', & '', & ' real,kind=KIND) :: atan2pi', & ' real,kind=KIND),intent(in) :: y, x', & '', & 'CHARACTERISTICS', & ' o X and Y must be reals of the same kind.', & '', & ' o The return value has the same type and kind as Y and X.', & '', & 'DESCRIPTION', & ' ATAN2PI(3) computes in half-revolutions a processor-dependent approximation', & ' of the arctangent of the components of the complex number ( X, Y ) or', & ' equivalently the principal value of the arctangent of the value Y/X (which', & ' determines a unique angle).', & '', & ' If Y has the value zero, X shall not have the value zero.', & '', & ' The resulting phase lies in the range -1 <= atan2pi (Y,X) <= 1 and is equal', & ' to a processor-dependent approximation to a value of arctan(Y/X).', & '', & 'OPTIONS', & ' o Y : The imaginary component of the complex value (X,Y) or the Y component', & ' of the point <X,Y>.', & '', & ' o X : The real component of the complex value (X,Y) or the X component of', & ' the point <X,Y>.', & '', & 'RESULT', & ' The value returned is by definition the principal value of the complex', & ' number (X, Y), or in other terms, the phase of the phasor x+i*y.', & '', & ' The principal value is simply what we get when we adjust an angular half-', & ' revolution value to lie between -1 and 1 inclusive,', & '', & ' The classic definition of the arctangent is the angle that is formed in', & ' Cartesian coordinates of the line from the origin point <0,0> to the point', & ' <X,Y> .', & '', & ' Pictured as a vector it is easy to see that if X and Y are both zero the', & ' angle is indeterminate because it sits directly over the origin, so', & ' ATAN(0.0,0.0) will produce an error.', & '', & ' Range of returned values by quadrant:', & '', & ' > +1/2', & ' > |', & ' > |', & ' > 1/2 < z < 1 | 0 > z < 1/2', & ' > |', & ' > +-1 -------------+---------------- +-0', & ' > |', & ' > 1/2 < -z < 1 | 0 < -z < 1/2', & ' > |', & ' > |', & ' > -1/2', & ' >', & ' NOTES:', & '', & ' If the processor distinguishes -0 and +0 then the sign of the', & ' returned value is that of Y when Y is zero, else when Y is zero', & ' the returned value is always positive.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atan2pi', & ' real :: z', & ' complex :: c', & ' real, parameter :: h2d = 180.0', & ' !', & ' ! basic usage', & ' ! atan2pi (1.5574077, 1.0) has the value 1.0 (approximately).', & ' z=atan2pi(1.5574077, 1.0)', & ' write(*,*) ''half-revolutions='',z,''degrees='',h2d*z', & ' !', & ' ! elemental arrays', & ' write(*,*)''elemental'',atan2pi( [10.0, 20.0], [30.0,40.0] )', & ' !', & ' ! elemental arrays and scalars', & ' write(*,*)''elemental'',atan2pi( [10.0, 20.0], 50.0 )', & ' !', & ' ! break complex values into real and imaginary components', & ' ! (note TAN2() can take a complex type value )', & ' c=(0.0,1.0)', & ' write(*,*)''complex'',c,atan2pi( x=c%re, y=c%im )', & ' !', & ' ! extended sample converting cartesian coordinates to polar', & ' COMPLEX_VALS: block', & ' real :: ang', & ' complex,allocatable :: vals(:)', & ' integer :: i', & ' !', & ' vals=[ &', & ' ( 1.0, 0.0 ), & ! 0', & ' ( 1.0, 1.0 ), & ! 45', & ' ( 0.0, 1.0 ), & ! 90', & ' (-1.0, 1.0 ), & ! 135', & ' (-1.0, 0.0 ), & ! 180', & ' (-1.0,-1.0 ), & ! 225', & ' ( 0.0,-1.0 )] ! 270', & ' write(*,''(a)'')repeat(''1234567890'',8)', & ' do i=1,size(vals)', & ' ang=atan2pi(vals(i)%im,vals(i)%re)', & ' write(*,101)vals(i),ang,h2d*ang', & ' enddo', & ' 101 format( &', & ' & ''X= '',f5.2, &', & ' & '' Y= '',f5.2, &', & ' & '' HALF-REVOLUTIONS= '',f7.3, &', & ' & T50,'' DEGREES= '',g0.4)', & ' endblock COMPLEX_VALS', & ' !', & ' end program demo_atan2pi', & '', & ' Results:', & '', & ' > half-revolutions= 0.318309873 degrees= 57.2957764', & ' > elemental 0.102416381 0.147583619', & ' > elemental 6.28329590E-02 0.121118948', & ' > complex (0.00000000,1.00000000) 0.500000000', & ' > X= 1.00 Y= 0.00 HALF-REVOLUTIONS= 0.000 DEGREES= 0.000', & ' > X= 1.00 Y= 1.00 HALF-REVOLUTIONS= 0.250 DEGREES= 45.00', & ' > X= 0.00 Y= 1.00 HALF-REVOLUTIONS= 0.500 DEGREES= 90.00', & ' > X= -1.00 Y= 1.00 HALF-REVOLUTIONS= 0.750 DEGREES= 135.0', & ' > X= -1.00 Y= 0.00 HALF-REVOLUTIONS= 1.000 DEGREES= 180.0', & ' > X= -1.00 Y= -1.00 HALF-REVOLUTIONS= -0.750 DEGREES= -135.0', & ' > X= 0.00 Y= -1.00 HALF-REVOLUTIONS= -0.500 DEGREES= -90.00', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' o ATAN(3)', & '', & 'RESOURCES', & ' o arctan:wikipedia Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 atan2pi(3fortran)', & ''] shortname="atan2pi" call process() case('24','atan') textblock=[character(len=256) :: & '', & 'atan(3fortran) atan(3fortran)', & '', & 'NAME', & ' ATAN(3) - [MATHEMATICS:TRIGONOMETRIC] Arctangent AKA inverse tangent', & ' function', & '', & 'SYNOPSIS', & ' result = atan([x) | atan(y, x)', & '', & ' elemental TYPE(kind=KIND) function atan(y,x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & ' TYPE(kind=**),intent(in),optional :: y', & '', & 'CHARACTERISTICS', & ' o If Y is present X and Y must both be real. Otherwise, X may be complex.', & '', & ' o KIND can be any kind supported by the associated type.', & '', & ' o The returned value is of the same type and kind as X.', & '', & 'DESCRIPTION', & ' ATAN(3) computes the arctangent of X.', & '', & 'OPTIONS', & ' o X : The value to compute the arctangent of. if Y is present, X shall be', & ' real.', & '', & ' o Y : is of the same type and kind as X. If X is zero, Y must not be zero.', & '', & 'RESULT', & ' The returned value is of the same type and kind as X. If Y is present, the', & ' result is identical to ATAN2(Y,X). Otherwise, it is the arc tangent of X,', & ' where the real part of the result is in radians and lies in the range -PI/2', & ' <= ATAN(X) <= PI/2', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atan', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' real(kind=real64),parameter :: &', & ' Deg_Per_Rad = 57.2957795130823208767981548_real64', & ' real(kind=real64) :: x', & ' x=2.866_real64', & ' print all, atan(x)', & '', & ' print all, atan( 2.0d0, 2.0d0),atan( 2.0d0, 2.0d0)*Deg_Per_Rad', & ' print all, atan( 2.0d0,-2.0d0),atan( 2.0d0,-2.0d0)*Deg_Per_Rad', & ' print all, atan(-2.0d0, 2.0d0),atan(-2.0d0, 2.0d0)*Deg_Per_Rad', & ' print all, atan(-2.0d0,-2.0d0),atan(-2.0d0,-2.0d0)*Deg_Per_Rad', & '', & ' end program demo_atan', & '', & ' Results:', & '', & ' > 1.235085437457879', & ' > .7853981633974483 45.00000000000000', & ' > 2.356194490192345 135.0000000000000', & ' > -.7853981633974483 -45.00000000000000', & ' > -2.356194490192345 -135.0000000000000', & '', & 'STANDARD', & ' FORTRAN 77 for a complex argument; and for two arguments Fortran 2008', & '', & 'SEE ALSO', & ' ATAN2(3), TAN(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 atan(3fortran)', & ''] shortname="atan" call process() case('25','atand') textblock=[character(len=256) :: & '', & 'atand(3fortran) atand(3fortran)', & '', & 'NAME', & ' ATAND(3) - [MATHEMATICS:TRIGONOMETRIC] Arc tangent AKA inverse tangent', & ' function in degrees', & '', & 'SYNOPSIS', & ' result = atand(x) | atand(y, x)', & '', & ' elemental real(kind=KIND) function atand(y,x)', & '', & ' real(kind=KIND),intent(in) :: x', & ' real(kind=**),intent(in),optional :: y', & '', & 'CHARACTERISTICS', & ' o If Y is present X and Y must both be of the same kind.', & '', & ' o KIND can be any kind supported by the associated type.', & '', & ' o The returned value is real of the same kind as X.', & '', & 'DESCRIPTION', & ' ATAND(3) calculates the Arc Tangent function in degrees.', & '', & 'OPTIONS', & ' o X : The real value to compute the arctangent of.', & '', & ' o Y : is real of the same kind as X. If X is zero, Y must not be zero.', & '', & 'RESULT', & ' The returned value is a real type of the same kind as X that approximates', & ' the arc tangent of X expressed in degrees. If Y is present, the result is', & ' identical to ATAN2D(Y,X). The result lies in the range -90 <= ATAND(X) <= 90', & ' .', & '', & 'EXAMPLES', & ' atand(1.0) has the value 45.0 (approximately).', & '', & ' Sample program:', & '', & ' program demo_atand', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' real(kind=real64),parameter :: &', & ' Deg_Per_Rad = 57.2957795130823208767981548_real64', & ' real(kind=real64) :: x', & ' x=2.866_real64', & ' print all, atand(x)', & '', & ' print all, atand( 2.0d0, 2.0d0),atand( 2.0d0, 2.0d0)/Deg_Per_Rad', & ' print all, atand( 2.0d0,-2.0d0),atand( 2.0d0,-2.0d0)/Deg_Per_Rad', & ' print all, atand(-2.0d0, 2.0d0),atand(-2.0d0, 2.0d0)/Deg_Per_Rad', & ' print all, atand(-2.0d0,-2.0d0),atand(-2.0d0,-2.0d0)/Deg_Per_Rad', & '', & ' end program demo_atand', & '', & ' Results:', & '', & ' > 70.765182904405478', & ' > 45.000000000000000 0.78539816339744828', & ' > 135.00000000000000 2.3561944901923448', & ' > -45.000000000000000 -0.78539816339744828', & ' > -135.00000000000000 -2.3561944901923448', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' ATAN2D(3), TAND(3), ATAN2(3), TAN(3), ATAN2PI(3), TANPI(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 atand(3fortran)', & ''] shortname="atand" call process() case('26','atanh') textblock=[character(len=256) :: & '', & 'atanh(3fortran) atanh(3fortran)', & '', & 'NAME', & ' ATANH(3) - [MATHEMATICS:TRIGONOMETRIC] Inverse hyperbolic tangent function', & '', & 'SYNOPSIS', & ' result = atanh(x)', & '', & ' elemental TYPE(kind=KIND) function atanh(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X may be real or complex of any associated type', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' ATANH(3) computes the inverse hyperbolic tangent of X.', & '', & 'OPTIONS', & ' o X : The type shall be real or complex.', & '', & 'RESULT', & ' The return value has same type and kind as X. If X is complex, the imaginary', & ' part of the result is in radians and lies between', & '', & ' -PI/2 <= aimag(atanh(x)) <= PI/2', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atanh', & ' implicit none', & ' real, dimension(3) :: x = [ -1.0, 0.0, 1.0 ]', & '', & ' write (*,*) atanh(x)', & '', & ' end program demo_atanh', & '', & ' Results:', & '', & ' > -Infinity 0.0000000E+00 Infinity', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' Inverse function: TANH(3)', & '', & 'RESOURCES', & ' o Wikipedia:hyperbolic functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 atanh(3fortran)', & ''] shortname="atanh" call process() case('27','atanpi') textblock=[character(len=256) :: & '', & 'atanpi(3fortran) atanpi(3fortran)', & '', & 'NAME', & ' ATANPI(3) - [MATHEMATICS:TRIGONOMETRIC] Circular Arctangent AKA inverse', & ' tangent function', & '', & 'SYNOPSIS', & ' result = atanpi([x) | atanpi(y, x)', & '', & ' elemental real(kind=KIND) function atanpi(y,x)', & '', & ' real(kind=KIND),intent(in) :: x', & ' real(kind=KIND),intent(in),optional :: y', & '', & 'CHARACTERISTICS', & ' o Y and X must both be real and of the same KIND', & '', & ' o KIND can be any kind supported by the real type.', & '', & ' o The returned value is of the same type and kind as X.', & '', & 'DESCRIPTION', & ' ATAN(3) computes the circular arctangent of X in half-revolutions.', & '', & ' If Y appears, the result is the same as the result of ATAN2PI(Y,X). If Y', & ' does not appear, the result has a value equal to a processor-dependent', & ' approximation to the arc tangent of X; it is expressed in half-revolutions', & ' and lies in the range -0.5 <= ATANPI(X) <= 0.5.', & '', & ' Example. ATANPI(1.0) has the value 0.25 (approximately).', & '', & 'OPTIONS', & ' o X : The real value to compute the arctangent of.', & '', & ' o Y : is of the same type and kind as X. If X is zero, Y must not be zero.', & '', & 'RESULT', & ' The returned value is of the same type and kind as X. If Y is present, the', & ' result is identical to ATAN2PI(Y,X). Otherwise, it is the arc tangent of X,', & ' where the result is in half-revolutions and lies in the range -1 <= ATAN(X)', & ' <= 1', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atanpi', & ' use, intrinsic :: iso_fortran_env, only : real32, real64', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' real(kind=real64) :: x, y', & ' x=2.866_real64', & ' print all, atanpi(x)', & '', & ' print all, atanpi( 2.0d0, 2.0d0),atanpi( 2.0d0, 2.0d0)*180', & ' print all, atanpi( 2.0d0,-2.0d0),atanpi( 2.0d0,-2.0d0)*180', & ' print all, atanpi(-2.0d0, 2.0d0),atanpi(-2.0d0, 2.0d0)*180', & ' print all, atanpi(-2.0d0,-2.0d0),atanpi(-2.0d0,-2.0d0)*180', & '', & ' end program demo_atanpi', & '', & ' Results:', & '', & ' > 0.39313990502447488', & ' > 0.25000000000000000 45.000000000000000', & ' > 0.75000000000000000 135.00000000000000', & ' > -0.25000000000000000 -45.000000000000000', & ' > -0.75000000000000000 -135.00000000000000', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' ATAN2D(3), TAN2D(3), ATAN2PI(3), TAN2PI(3)', & '', & 'RESOURCES', & ' o wikipedia: inverse trigonometric functions', & '', & ' March 16, 2025 atanpi(3fortran)', & ''] shortname="atanpi" call process() case('28','atomic_add') textblock=[character(len=256) :: & '', & 'atomic_add(3fortran) atomic_add(3fortran)', & '', & 'NAME', & ' ATOMIC_ADD(3) - [ATOMIC] Atomic ADD operation', & '', & 'SYNOPSIS', & ' call atomic_add (atom, value [,stat] )', & '', & ' subroutine atomic_add(atom,value,stat)', & '', & ' integer(atomic_int_kind) :: atom[*]', & ' integer(atomic_int_kind),intent(in) :: value', & ' integer,intent(out),intent(out) :: stat', & '', & 'CHARACTERISTICS', & ' o ATOM is a scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE is a scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT is a Scalar default-kind integer variable.', & '', & 'DESCRIPTION', & ' ATOMIC_ADD(3) atomically adds the value of VAR to the variable ATOM. When', & ' STAT is present and the invocation was successful, it is assigned the value', & ' 0. If it is present and the invocation has failed, it is assigned a positive', & ' value; in particular, for a coindexed ATOM, if the remote image has stopped,', & ' it is assigned the value of iso_fortran_env''s STAT_STOPPED_IMAGE and if the', & ' remote image has failed, the value STAT_FAILED_IMAGE.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_add', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*]', & ' call atomic_add (atom[1], this_image())', & ' end program demo_atomic_add', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_FETCH_ADD(3), ATOMIC_AND(3), ATOMIC_OR(3),', & ' ATOMIC_XOR(3) ISO_FORTRAN_ENV(3),', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_add(3fortran)', & ''] shortname="atomic_add" call process() case('29','atomic_and') textblock=[character(len=256) :: & '', & 'atomic_and(3fortran) atomic_and(3fortran)', & '', & 'NAME', & ' ATOMIC_AND(3) - [ATOMIC:BIT MANIPULATION] Atomic bitwise AND operation', & '', & 'SYNOPSIS', & ' call atomic_and(atom, value [,stat])', & '', & ' subroutine atomic_and(atom,value,stat)', & '', & ' integer(atomic_int_kind) :: atom[*]', & ' integer(atomic_int_kind),intent(in) :: value', & ' integer,intent(out),intent(out) :: stat', & '', & 'CHARACTERISTICS', & ' o ATOM is a scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE is a scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT is a Scalar default-kind integer variable.', & '', & 'DESCRIPTION', & ' ATOMIC_AND(3) atomically defines ATOM with the bitwise AND between the', & ' values of ATOM and VALUE. When STAT is present and the invocation was', & ' successful, it is assigned the value 0. If it is present and the invocation', & ' has failed, it is assigned a positive value; in particular, for a coindexed', & ' ATOM, if the remote image has stopped, it is assigned the value of', & ' iso_fortran_env''s stat_stopped_image and if the remote image has failed, the', & ' value stat_failed_image.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_and', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*]', & ' call atomic_and(atom[1], int(b''10100011101''))', & ' end program demo_atomic_and', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_FETCH_AND(3), ATOMIC_DEFINE(3), ATOMIC_REF(3), ATOMIC_CAS(3),', & ' ISO_FORTRAN_ENV(3), ATOMIC_ADD(3), ATOMIC_OR(3), ATOMIC_XOR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_and(3fortran)', & ''] shortname="atomic_and" call process() case('30','atomic_cas') textblock=[character(len=256) :: & '', & 'atomic_cas(3fortran) atomic_cas(3fortran)', & '', & 'NAME', & ' ATOMIC_CAS(3) - [ATOMIC] Atomic compare and swap', & '', & 'SYNOPSIS', & ' call atomic_cas (atom, old, compare, new [,stat] )', & '', & ' subroutine atomic_cas (atom, old, compare, new, stat)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' ATOMIC_CAS(3) compares the variable ATOM with the value of COMPARE; if the', & ' value is the same, ATOM is set to the value of NEW. Additionally, OLD is set', & ' to the value of ATOM that was used for the comparison. When STAT is present', & ' and the invocation was successful, it is assigned the value 0. If it is', & ' present and the invocation has failed, it is assigned a positive value; in', & ' particular, for a coindexed ATOM, if the remote image has stopped, it is', & ' assigned the value of iso_fortran_env''s stat_stopped_image and if the remote', & ' image has failed, the value stat_failed_image.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of either integer type with', & ' atomic_int_kind kind or logical type with atomic_logical_kind kind.', & '', & ' o OLD : Scalar of the same type and kind as ATOM.', & '', & ' o COMPARE : Scalar variable of the same type and kind as ATOM.', & '', & ' o NEW : Scalar variable of the same type as ATOM. If kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_cas', & ' use iso_fortran_env', & ' implicit none', & ' logical(atomic_logical_kind) :: atom[*], prev', & ' call atomic_cas(atom[1], prev, .false., .true.)', & ' end program demo_atomic_cas', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_REF(3), ISO_FORTRAN_ENV(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_cas(3fortran)', & ''] shortname="atomic_cas" call process() case('31','atomic_define') textblock=[character(len=256) :: & '', & 'atomic_define(3fortran) atomic_define(3fortran)', & '', & 'NAME', & ' ATOMIC_DEFINE(3) - [ATOMIC] Setting a variable atomically', & '', & 'SYNOPSIS', & ' call atomic_define (atom, value [,stat] )', & '', & ' subroutine atomic_define(atom, value, stat)', & '', & ' TYPE(kind=atomic_KIND_kind) :: atom[*]', & ' TYPE(kind=KIND) :: value', & ' integer,intent(out),optional :: stat', & '', & 'CHARACTERISTICS', & ' o ATOM : Scalar coarray or coindexed variable of either integer type with', & ' atomic_int_kind kind or logical type with atomic_logical_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'DESCRIPTION', & ' ATOMIC_DEFINE(3) defines the variable ATOM with the value VALUE atomically.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable to atomically assign the', & ' value VALUE to. kind.', & '', & ' o VALUE : value to assign to ATOM', & '', & ' o STAT : When STAT is present and the invocation was successful, it is', & ' assigned the value 0. If it is present and the invocation has failed, it', & ' is assigned a positive value; in particular, for a coindexed ATOM, if the', & ' remote image has stopped, it is assigned the value of iso_fortran_env''s', & ' stat_stopped_image and if the remote image has failed, the value', & ' stat_failed_image.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_define', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*]', & ' call atomic_define(atom[1], this_image())', & ' end program demo_atomic_define', & '', & 'STANDARD', & ' Fortran 2008 ; with STAT, TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_REF(3), ATOMIC_CAS(3), ISO_FORTRAN_ENV(3), ATOMIC_ADD(3),', & ' ATOMIC_AND(3), ATOMIC_OR(3), ATOMIC_XOR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_define(3fortran)', & ''] shortname="atomic_define" call process() case('32','atomic_fetch_add') textblock=[character(len=256) :: & '', & 'atomic_fetch_add(3fortran) atomic_fetch_add(3fortran)', & '', & 'NAME', & ' ATOMIC_FETCH_ADD(3) - [ATOMIC] Atomic ADD operation with prior fetch', & '', & 'SYNOPSIS', & ' call atomic_fetch_add(atom, value, old [,stat] )', & '', & ' subroutine atomic_fetch_add(atom, value, old, stat)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' ATOMIC_FETCH_ADD(3) atomically stores the value of ATOM in OLD and adds the', & ' value of VAR to the variable ATOM. When STAT is present and the invocation', & ' was successful, it is assigned the value 0. If it is present and the', & ' invocation has failed, it is assigned a positive value; in particular, for a', & ' coindexed ATOM, if the remote image has stopped, it is assigned the value of', & ' iso_fortran_env''s stat_stopped_image and if the remote image has failed, the', & ' value stat_failed_image.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind. atomic_logical_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o OLD : Scalar of the same type and kind as ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_fetch_add', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*], old', & ' call atomic_add(atom[1], this_image(), old)', & ' end program demo_atomic_fetch_add', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_ADD(3), ISO_FORTRAN_ENV(3),', & '', & ' ATOMIC_FETCH_AND(3), ATOMIC_FETCH_OR(3),', & '', & ' ATOMIC_FETCH_XOR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_fetch_add(3fortran)', & ''] shortname="atomic_fetch_add" call process() case('33','atomic_fetch_and') textblock=[character(len=256) :: & '', & 'atomic_fetch_and(3fortran) atomic_fetch_and(3fortran)', & '', & 'NAME', & ' ATOMIC_FETCH_AND(3) - [ATOMIC:BIT MANIPULATION] Atomic bitwise AND operation', & ' with prior fetch', & '', & 'SYNOPSIS', & ' call atomic_fetch_and(atom, value, old [,stat] )', & '', & ' subroutine atomic_fetch_and(atom, value, old, stat)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' ATOMIC_FETCH_AND(3) atomically stores the value of ATOM in OLD and defines', & ' ATOM with the bitwise AND between the values of ATOM and VALUE. When STAT', & ' is present and the invocation was successful, it is assigned the value 0. If', & ' it is present and the invocation has failed, it is assigned a positive', & ' value; in particular, for a coindexed ATOM, if the remote image has stopped,', & ' it is assigned the value of iso_fortran_env''s stat_stopped_image and if the', & ' remote image has failed, the value stat_failed_image.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o OLD : Scalar of the same type and kind as ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_fetch_and', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*], old', & ' call atomic_fetch_and (atom[1], int(b''10100011101''), old)', & ' end program demo_atomic_fetch_and', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_AND(3), ISO_FORTRAN_ENV(3),', & '', & ' ATOMIC_FETCH_ADD(3), ATOMIC_FETCH_OR(3),', & '', & ' ATOMIC_FETCH_XOR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_fetch_and(3fortran)', & ''] shortname="atomic_fetch_and" call process() case('34','atomic_fetch_or') textblock=[character(len=256) :: & '', & 'atomic_fetch_or(3fortran) atomic_fetch_or(3fortran)', & '', & 'NAME', & ' ATOMIC_FETCH_OR(3) - [ATOMIC:BIT MANIPULATION] Atomic bitwise OR operation', & ' with prior fetch', & '', & 'SYNOPSIS', & ' call atomic_fetch_or(atom, value, old [,stat] )', & '', & ' subroutine atomic_fetch_or(atom, value, old, stat)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' ATOMIC_FETCH_OR(3) atomically stores the value of ATOM in OLD and defines', & ' ATOM with the bitwise OR between the values of ATOM and VALUE. When STAT is', & ' present and the invocation was successful, it is assigned the value 0. If it', & ' is present and the invocation has failed, it is assigned a positive value;', & ' in particular, for a coindexed ATOM, if the remote image has stopped, it is', & ' assigned the value of iso_fortran_env''s stat_stopped_image and if the remote', & ' image has failed, the value stat_failed_image.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o OLD : Scalar of the same type and kind as ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_fetch_or', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*], old', & ' call atomic_fetch_or(atom[1], int(b''10100011101''), old)', & ' end program demo_atomic_fetch_or', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_OR(3), ISO_FORTRAN_ENV(3),', & '', & ' ATOMIC_FETCH_ADD(3), ATOMIC_FETCH_AND(3),', & '', & ' ATOMIC_FETCH_XOR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_fetch_or(3fortran)', & ''] shortname="atomic_fetch_or" call process() case('35','atomic_fetch_xor') textblock=[character(len=256) :: & '', & 'atomic_fetch_xor(3fortran) atomic_fetch_xor(3fortran)', & '', & 'NAME', & ' ATOMIC_FETCH_XOR(3) - [ATOMIC:BIT MANIPULATION] Atomic bitwise XOR operation', & ' with prior fetch', & '', & 'SYNOPSIS', & ' call atomic_fetch_xor (atom, value, old [,stat] )', & '', & ' subroutine atomic_fetch_xor (atom, value, old, stat)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' ATOMIC_FETCH_XOR(3) atomically stores the value of ATOM in OLD and defines', & ' ATOM with the bitwise XOR between the values of ATOM and VALUE. When STAT', & ' is present and the invocation was successful, it is assigned the value 0. If', & ' it is present and the invocation has failed, it is assigned a positive', & ' value; in particular, for a coindexed ATOM, if the remote image has stopped,', & ' it is assigned the value of iso_fortran_env''s stat_stopped_image and if the', & ' remote image has failed, the value stat_failed_image.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o OLD : Scalar of the same type and kind as ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_fetch_xor', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*], old', & ' call atomic_fetch_xor (atom[1], int(b''10100011101''), old)', & ' end program demo_atomic_fetch_xor', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_XOR(3), ISO_FORTRAN_ENV(3),', & '', & ' ATOMIC_FETCH_ADD(3), ATOMIC_FETCH_AND(3),', & '', & ' ATOMIC_FETCH_OR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_fetch_xor(3fortran)', & ''] shortname="atomic_fetch_xor" call process() case('36','atomic_or') textblock=[character(len=256) :: & '', & 'atomic_or(3fortran) atomic_or(3fortran)', & '', & 'NAME', & ' ATOMIC_OR(3) - [ATOMIC:BIT MANIPULATION] Atomic bitwise OR operation', & '', & 'SYNOPSIS', & ' call atomic_or(atom, value [,stat] )', & '', & ' subroutine atomic_or(atom,value,stat)', & '', & ' integer(atomic_int_kind) :: atom[*]', & ' integer(atomic_int_kind),intent(in) :: value', & ' integer,intent(out),intent(out) :: stat', & '', & 'CHARACTERISTICS', & ' o ATOM is a scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE is a scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT is a Scalar default-kind integer variable.', & '', & 'DESCRIPTION', & ' ATOMIC_OR(3) atomically defines ATOM with the bitwise OR between the values', & ' of ATOM and VALUE. When STAT is present and the invocation was successful,', & ' it is assigned the value 0. If it is present and the invocation has failed,', & ' it is assigned a positive value; in particular, for a coindexed ATOM, if the', & ' remote image has stopped, it is assigned the value of iso_fortran_env''s', & ' stat_stopped_image and if the remote image has failed, the value', & ' stat_failed_image.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_or', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*]', & ' call atomic_or(atom[1], int(b''10100011101''))', & ' end program demo_atomic_or', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_FETCH_OR(3),', & '', & ' ISO_FORTRAN_ENV(3), ATOMIC_ADD(3), ATOMIC_OR(3),', & '', & ' ATOMIC_XOR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_or(3fortran)', & ''] shortname="atomic_or" call process() case('37','atomic_ref') textblock=[character(len=256) :: & '', & 'atomic_ref(3fortran) atomic_ref(3fortran)', & '', & 'NAME', & ' ATOMIC_REF(3) - [ATOMIC] Obtaining the value of a variable atomically', & '', & 'SYNOPSIS', & ' call atomic_ref(value, atom [,stat] )', & '', & ' subroutine atomic_ref(value,atom,stat)', & '', & ' integer(atomic_int_kind),intent(in) :: value', & ' integer(atomic_int_kind) :: atom[*]', & ' integer,intent(out),intent(out) :: stat', & '', & 'CHARACTERISTICS', & ' o ATOM is a scalar coarray or coindexed variable of either integer type', & ' with atomic_int_kind kind or logical type with atomic_logical_kind kind.', & '', & ' o VALUE is a scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT is a Scalar default-kind integer variable.', & '', & 'DESCRIPTION', & ' ATOMIC_REF(3) atomically assigns the value of the variable ATOM to VALUE.', & ' When STAT is present and the invocation was successful, it is assigned the', & ' value 0. If it is present and the invocation has failed, it is assigned a', & ' positive value; in particular, for a coindexed ATOM, if the remote image has', & ' stopped, it is assigned the value of iso_fortran_env''s STAT_STOPPED_IMAGE', & ' and if the remote image has failed, the value STAT_FAILED_IMAGE.', & '', & 'OPTIONS', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o ATOM : Scalar coarray or coindexed variable of either integer type with', & ' atomic_int_kind kind or logical type with atomic_logical_kind kind.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_ref', & ' use iso_fortran_env', & ' implicit none', & ' logical(atomic_logical_kind) :: atom[*]', & ' logical :: val', & ' call atomic_ref( val, atom[1] )', & ' if (val) then', & ' print *, "Obtained"', & ' endif', & ' end program demo_atomic_ref', & '', & 'STANDARD', & ' Fortran 2008 ; with STAT, TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_CAS(3), ISO_FORTRAN_ENV(3),', & '', & ' ATOMIC_FETCH_ADD(3), ATOMIC_FETCH_AND(3),', & '', & ' ATOMIC_FETCH_OR(3), ATOMIC_FETCH_XOR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_ref(3fortran)', & ''] shortname="atomic_ref" call process() case('38','atomic_xor') textblock=[character(len=256) :: & '', & 'atomic_xor(3fortran) atomic_xor(3fortran)', & '', & 'NAME', & ' ATOMIC_XOR(3) - [ATOMIC:BIT MANIPULATION] Atomic bitwise OR operation', & '', & 'SYNOPSIS', & ' call atomic_xor(atom, value [,stat] )', & '', & ' subroutine atomic_xor(atom,value,stat)', & '', & ' integer(atomic_int_kind) :: atom[*]', & ' integer(atomic_int_kind),intent(in) :: value', & ' integer,intent(out),intent(out) :: stat', & '', & 'CHARACTERISTICS', & ' o ATOM is a scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE is a scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT is a Scalar default-kind integer variable.', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' ATOMIC_XOR(3) atomically defines ATOM with the bitwise XOR between the', & ' values of ATOM and VALUE. When STAT is present and the invocation was', & ' successful, it is assigned the value 0. If it is present and the invocation', & ' has failed, it is assigned a positive value; in particular, for a coindexed', & ' ATOM, if the remote image has stopped, it is assigned the value of', & ' iso_fortran_env''s stat_stopped_image and if the remote image has failed, the', & ' value stat_failed_image.', & '', & 'OPTIONS', & ' o ATOM : Scalar coarray or coindexed variable of integer type with', & ' atomic_int_kind kind.', & '', & ' o VALUE : Scalar of the same type as ATOM. If the kind is different, the', & ' value is converted to the kind of ATOM.', & '', & ' o STAT : (optional) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_atomic_xor', & ' use iso_fortran_env', & ' implicit none', & ' integer(atomic_int_kind) :: atom[*]', & ' call atomic_xor(atom[1], int(b''10100011101''))', & ' end program demo_atomic_xor', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' ATOMIC_DEFINE(3), ATOMIC_FETCH_XOR(3), ISO_FORTRAN_ENV(3), ATOMIC_ADD(3),', & ' ATOMIC_OR(3), ATOMIC_XOR(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 atomic_xor(3fortran)', & ''] shortname="atomic_xor" call process() case('39','backspace') textblock=[character(len=256) :: & '', & 'backspace(7fortran) backspace(7fortran)', & '', & 'NAME', & ' backspace(7f) - [IO:FILE POSITIONING] - backspace one record on specified', & ' I/O unit', & '', & 'SYNOPSIS', & ' BACKSPACE file-unit-number', & '', & ' BACKSPACE([UNIT=]unit-number][,IOMSG=iomsg][,IOSTAT=iostat][,ERR=label])', & '', & 'DESCRIPTION', & ' backspace(7f) positions the specified file back to the beginning of the', & ' current record or if already at the beginning of a record, back to the', & ' beginning of the previous record.', & '', & ' If the file is at its initial point, the position of the file is not', & ' changed.', & '', & ' It is most often used when a program has partially read a line and then', & ' wants to go back and reread the line using the information from the previous', & ' read(7f),', & '', & ' backspace(7f) is rarely used in new code as the subsequent addition of', & ' Fortran features such as non-advancing I/O and internal reads into a', & ' CHARACTER variable (which can be read from multiple times) are typically far', & ' more efficient and provide much of the same functionality when re-reading', & ' the current line.', & '', & ' Backspacing is very inefficient on many current platforms. Reading a file', & ' with stream-I/O and indexing relevant line positions to return to; or using', & ' direct-access files is far more efficient than backspacing through a file', & ' when moving back large numbers of lines on Linux and Unix platforms.', & '', & ' A unit open for direct access or unformatted access cannot be referenced by', & ' backspace(7f). backspace(7f) only works with formatted sequential files that', & ' may be repositioned. So it does not generally work with standard input from', & ' a terminal, pipes, and other formatted sequential file types that cannot be', & ' rewound or positioned.', & '', & ' Backspacing over records written using list-directed or namelist formatting', & ' is prohibited. It will usually work, but since the compiler is free to write', & ' list-directed or namelist output on a varying number of lines it is not', & ' supported, as it is not certain what data is on which line unless the', & ' program itself searches for particular strings.', & '', & ' Backspacing a file that is connected but does not exist is prohibited.', & '', & ' If a BACKSPACE statement causes the implicit writing of an endfile record,', & ' the file is positioned before the record that precedes the endfile record.', & '', & ' If the preceding record is an endfile record, the file is positioned before', & ' the endfile record.', & '', & 'OPTIONS', & ' UNIT : unit number of file to backspace one line on. A unit open for direct', & ' access or unformatted access cannot be referenced by a BACKSPACE. IOSTAT :', & ' a compiler-specific number that indicates an error occurred if non-zero.', & ' IOMSG : a message describing error IOSTAT if IOSTAT is not zero. ERR : a', & ' label number to jump to if an error occurs', & '', & 'EXAMPLE', & ' An example of a BACKSPACE statement is:', & '', & ' program demo_backspace', & ' implicit none', & ' character(len=256) :: line', & ' character(len=256) :: mssge', & ' integer :: i', & ' integer :: j', & ' integer :: ios', & ' integer,allocatable :: iarr(:)', & '', & ' ! create a basic sequential file', & ' open(10,file=''dem_backspace.txt'',action=''readwrite'') ! open a file', & ' do i=1,30 ! write lines to it', & ' write(10,''(a,i3,*(i3))'') ''line '',i, (j,j=1,i)', & ' enddo', & '', & ' ! back up several lines', & ' do i=1,14', & ' backspace(10, iostat=ios,iomsg=mssge)', & ' if(ios.ne.0)then', & ' write(*,''(*(a))'') ''*dem_backspace* ERROR:'',mssge', & ' endif', & ' enddo', & ' read(10,''(a)'')line', & ' write(*,*)''back at a previous record !''', & '', & ' ! read line as a string', & ' write(*,''("string=",a)'')trim(line)', & '', & ' ! backspace so can read again as numbers', & ' backspace(10)', & ' ! read part of a line numerically to get size of array to read', & ' read(10,''(5x,i3)'')i', & ' allocate(iarr(i))', & '', & ' ! reread line just reading array', & ' backspace(10)', & ' read(10,''(8x,*(i3))'')iarr', & ' write(*,''(*(g0,1x))'')''size='',i,''array='',iarr', & '', & ' !! Note: writing a new line will truncate file', & ' !! to current record position', & '', & ' close(10,status=''delete'')', & '', & ' end program demo_backspace', & '', & ' Results:', & '', & ' > back at a previous record !', & ' > string=line 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17', & ' > size= 17 array= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 backspace(7fortran)', & ''] shortname="backspace" call process() case('40','bessel_j0') textblock=[character(len=256) :: & '', & 'bessel_j0(3fortran) bessel_j0(3fortran)', & '', & 'NAME', & ' BESSEL_J0(3) - [MATHEMATICS] Bessel function of the first kind of order 0', & '', & 'SYNOPSIS', & ' result = bessel_j0(x)', & '', & ' elemental real(kind=KIND) function bessel_j0(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o KIND may be any KIND supported by the real type.', & '', & ' o The result is the same type and kind as X.', & '', & 'DESCRIPTION', & ' BESSEL_J0(3) computes the Bessel function of the first kind of order 0 of X.', & '', & 'OPTIONS', & ' o X : The value to operate on.', & '', & 'RESULT', & ' the Bessel function of the first kind of order 0 of X. The result lies in', & ' the range -0.4027 <= BESSEL(0,X) <= 1.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bessel_j0', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x', & ' x = 0.0_real64', & ' x = bessel_j0(x)', & ' write(*,*)x', & ' end program demo_bessel_j0', & '', & ' Results:', & '', & ' > 1.0000000000000000', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BESSEL_J1(3), BESSEL_JN(3), BESSEL_Y0(3), BESSEL_Y1(3), BESSEL_YN(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 bessel_j0(3fortran)', & ''] shortname="bessel_j0" call process() case('41','bessel_j1') textblock=[character(len=256) :: & '', & 'bessel_j1(3fortran) bessel_j1(3fortran)', & '', & 'NAME', & ' BESSEL_J1(3) - [MATHEMATICS] Bessel function of the first kind of order 1', & '', & 'SYNOPSIS', & ' result = bessel_j1(x)', & '', & ' elemental real(kind=KIND) function bessel_j1(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o KIND may be any supported real KIND.', & '', & ' o the result is of the same type and kind as X', & '', & 'DESCRIPTION', & ' BESSEL_J1(3) computes the Bessel function of the first kind of order 1 of X.', & '', & 'OPTIONS', & ' o X : The type shall be real.', & '', & 'RESULT', & ' The return value is of type real and lies in the range -0.5818 <=', & ' BESSEL(0,X) <= 0.5818 . It has the same kind as X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bessel_j1', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 1.0_real64', & ' x = bessel_j1(x)', & ' write(*,*)x', & ' end program demo_bessel_j1', & '', & ' Results:', & '', & ' > 0.44005058574493350', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BESSEL_J0(3), BESSEL_JN(3), BESSEL_Y0(3), BESSEL_Y1(3), BESSEL_YN(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 bessel_j1(3fortran)', & ''] shortname="bessel_j1" call process() case('42','bessel_jn') textblock=[character(len=256) :: & '', & 'bessel_jn(3fortran) bessel_jn(3fortran)', & '', & 'NAME', & ' BESSEL_JN(3) - [MATHEMATICS] Bessel function of the first kind', & '', & 'SYNOPSIS', & ' result = bessel_jn(n, x)', & '', & ' elemental real(kind=KIND) function bessel_jn(n,x)', & '', & ' integer(kind=**),intent(in) :: n', & ' real(kind=KIND),intent(in) :: x', & '', & ' o KIND may be any valid value for type real', & '', & ' o X is real', & '', & ' o The return value has the same type and kind as X.', & '', & ' result = bessel_jn(n1, n2, x)', & '', & ' real(kind=KIND) function bessel_jn(n1, n2, ,x)', & '', & ' integer(kind=**),intent(in) :: n1', & ' integer(kind=**),intent(in) :: n2', & ' real(kind=KIND),intent(in) :: x', & '', & ' o N1 is integer', & '', & ' o N2 is integer', & '', & ' o X is real', & '', & ' o The return value has the same type and kind as X.', & '', & 'DESCRIPTION', & ' BESSEL_JN( N, X ) computes the Bessel function of the first kind of order N', & ' of X.', & '', & ' BESSEL_JN(N1, N2, X) returns an array with the Bessel function|Bessel', & ' functions of the first kind of the orders N1 to N2.', & '', & 'OPTIONS', & ' o N : a non-negative scalar integer..', & '', & ' o N1 : a non-negative scalar integer.', & '', & ' o N2 : a non-negative scalar integer.', & '', & ' o X : Shall be a scalar for BESSEL_JN(N,X) or an array For BESSEL_JN(N1,', & ' N2, X).', & '', & 'RESULT', & ' The result value of BESSEL_JN (N, X) is a processor-dependent approximation', & ' to the Bessel function of the first kind and order N of X.', & '', & ' The result of BESSEL_JN (N1, N2, X) is a rank-one array with extent MAX', & ' (N2-N1+1, 0). Element i of the result value of BESSEL_JN (N1, N2, X) is a', & ' processor-dependent approximation to the Bessel function of the first kind', & ' and order N1+i-1 of X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bessel_jn', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 1.0_real64', & ' x = bessel_jn(5,x)', & ' write(*,*)x', & ' end program demo_bessel_jn', & '', & ' Results:', & '', & ' > 2.4975773021123450E-004', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BESSEL_J0(3), BESSEL_J1(3), BESSEL_Y0(3), BESSEL_Y1(3), BESSEL_YN(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 bessel_jn(3fortran)', & ''] shortname="bessel_jn" call process() case('43','bessel_y0') textblock=[character(len=256) :: & '', & 'bessel_y0(3fortran) bessel_y0(3fortran)', & '', & 'NAME', & ' BESSEL_Y0(3) - [MATHEMATICS] Bessel function of the second kind of order 0', & '', & 'SYNOPSIS', & ' result = bessel_y0(x)', & '', & ' elemental real(kind=KIND) function bessel_y0(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o KIND may be any supported real KIND.', & '', & ' o the result characteristics (type, kind) are the same as X', & '', & 'DESCRIPTION', & ' BESSEL_Y0(3) computes the Bessel function of the second kind of order 0 of', & ' X.', & '', & 'OPTIONS', & ' o X : The type shall be real. Its value shall be greater than zero.', & '', & 'RESULT', & ' The return value is of type real. It has the same kind as X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bessel_y0', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 0.0_real64', & ' x = bessel_y0(x)', & ' write(*,*)x', & ' end program demo_bessel_y0', & '', & ' Results:', & '', & ' > -Infinity', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BESSEL_J0(3), BESSEL_J1(3), BESSEL_JN(3), BESSEL_Y1(3), BESSEL_YN(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 bessel_y0(3fortran)', & ''] shortname="bessel_y0" call process() case('44','bessel_y1') textblock=[character(len=256) :: & '', & 'bessel_y1(3fortran) bessel_y1(3fortran)', & '', & 'NAME', & ' BESSEL_Y1(3) - [MATHEMATICS] Bessel function of the second kind of order 1', & '', & 'SYNOPSIS', & ' result = bessel_y1(x)', & '', & ' elemental real(kind=KIND) function bessel_y1(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o KIND may be any supported real KIND.', & '', & ' o the characteristics (type, kind) of the result are the same as X', & '', & 'DESCRIPTION', & ' BESSEL_Y1(3) computes the Bessel function of the second kind of order 1 of', & ' X.', & '', & 'OPTIONS', & ' o X : The type shall be real. Its value shall be greater than zero.', & '', & 'RESULT', & ' The return value is real. It has the same kind as X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bessel_y1', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 1.0_real64', & ' write(*,*)x, bessel_y1(x)', & ' end program demo_bessel_y1', & '', & ' Results:', & '', & ' > 1.00000000000000 -0.781212821300289', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BESSEL_J0(3), BESSEL_J1(3), BESSEL_JN(3), BESSEL_Y0(3), BESSEL_YN(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 bessel_y1(3fortran)', & ''] shortname="bessel_y1" call process() case('45','bessel_yn') textblock=[character(len=256) :: & '', & 'bessel_yn(3fortran) bessel_yn(3fortran)', & '', & 'NAME', & ' BESSEL_YN(3) - [MATHEMATICS] Bessel function of the second kind', & '', & 'SYNOPSIS', & ' result = bessel_yn(n, x)', & '', & ' elemental real(kind=KIND) function bessel_yn(n,x)', & '', & ' integer(kind=**),intent(in) :: n', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o N is integer', & '', & ' o X is real', & '', & ' o The return value has the same type and kind as X.', & '', & ' result = bessel_yn(n1, n2, x)', & '', & ' real(kind=KIND) function bessel_yn(n1, n2, ,x)', & '', & ' integer(kind=**),intent(in) :: n1', & ' integer(kind=**),intent(in) :: n2', & ' real(kind=KIND),intent(in) :: x', & '', & ' o N1 is integer', & '', & ' o N2 is integer', & '', & ' o X is real', & '', & ' o The return value has the same type and kind as X.', & '', & 'DESCRIPTION', & ' BESSEL_YN(N, X) computes the Bessel function of the second kind of order N', & ' of X.', & '', & ' BESSEL_YN(N1, N2, X) returns an array with the Bessel function|Bessel', & ' functions of the first kind of the orders N1 to N2.', & '', & 'OPTIONS', & ' o N : Shall be a scalar or an array of type integer and non-negative.', & '', & ' o N1 : Shall be a non-negative scalar of type integer and non-negative.', & '', & ' o N2 : Shall be a non-negative scalar of type integer and non-negative.', & '', & ' o X : A real non-negative value. Note BESSEL_YN(N1, N2, X) is not', & ' elemental, in which case it must be a scalar.', & '', & 'RESULT', & ' The result value of BESSEL_YN (N, X) is a processor-dependent approximation', & ' to the Bessel function of the second kind and order N of X.', & '', & ' The result of BESSEL_YN (N1, N2, X) is a rank-one array with extent MAX', & ' (N2-N1+1, 0). Element i of the result value of BESSEL_YN (N1, N2, X) is a', & ' processor-dependent approximation to the Bessel function of the second kind', & ' and order N1+i-1 of X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bessel_yn', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 1.0_real64', & ' write(*,*) x,bessel_yn(5,x)', & ' end program demo_bessel_yn', & '', & ' Results:', & '', & ' > 1.0000000000000000 -260.40586662581222', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BESSEL_J0(3), BESSEL_J1(3), BESSEL_JN(3), BESSEL_Y0(3), BESSEL_Y1(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 bessel_yn(3fortran)', & ''] shortname="bessel_yn" call process() case('46','bge') textblock=[character(len=256) :: & '', & 'bge(3fortran) bge(3fortran)', & '', & 'NAME', & ' BGE(3) - [BIT:COMPARE] Bitwise greater than or equal to', & '', & 'SYNOPSIS', & ' result = bge(i,j)', & '', & ' elemental logical function bge(i, j)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in) :: j', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o the integer kind of I and J may not necessarily be the same. In addition,', & ' values may be a BOZ constant with a value valid for the integer kind', & ' available with the most bits on the current platform.', & '', & ' o The return value is of type default logical.', & '', & 'DESCRIPTION', & ' BGE(3) Determines whether one integer is bitwise greater than or equal to', & ' another.', & '', & ' The bit-level representation of a value is platform dependent. The endian-', & ' ness of a system and whether the system uses a "two''s complement"', & ' representation of signs can affect the results, for example.', & '', & ' A BOZ constant (Binary, Octal, Hexadecimal) does not have a kind or type of', & ' its own, so be aware it is subject to truncation when transferred to an', & ' integer type. The most bits the constant may contain is limited by the most', & ' bits representable by any integer kind supported by the compilation.', & '', & ' Bit Sequence Comparison', & '', & ' When bit sequences of unequal length are compared, the shorter sequence is', & ' padded with zero bits on the left to the same length as the longer sequence', & ' (up to the largest number of bits any available integer kind supports).', & '', & ' Bit sequences are compared from left to right, one bit at a time, until', & ' unequal bits are found or until all bits have been compared and found to be', & ' equal.', & '', & ' The bits are always evaluated in this order, not necessarily from MSB to LSB', & ' (most significant bit to least significant bit).', & '', & ' If unequal bits are found the sequence with zero in the unequal position is', & ' considered to be less than the sequence with one in the unequal position.', & '', & 'OPTIONS', & ' o I : The value to test if >= J based on the bit representation of the', & ' values.', & '', & ' o J : The value to test I against.', & '', & 'RESULT', & ' Returns .true. if I is bit-wise greater than J and .false. otherwise.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bge', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: i', & ' integer(kind=int8) :: byte', & ' integer(kind=int8),allocatable :: arr1(:), arr2(:)', & '', & ' ! BASIC USAGE', & ' write(*,*)''bge(-127,127)='',bge( -127, 127 )', & ' ! on (very common) "two''s complement" machines that are', & ' ! little-endian -127 will be greater than 127', & '', & ' ! BOZ constants', & ' ! BOZ constants are subject to truncation, so make sure', & ' ! your values are valid for the integer kind being compared to', & ' write(*,*)''bge(b"0001",2)='',bge( b"1", 2)', & '', & ' ! ELEMENTAL', & ' ! an array and scalar', & ' write(*, *)''compare array of values [-128, -0, +0, 127] to 127''', & ' write(*, *)bge(int([-128, -0, +0, 127], kind=int8), 127_int8)', & '', & ' ! two arrays', & ' write(*, *)''compare two arrays''', & ' arr1=int( [ -127, -0, +0, 127], kind=int8 )', & ' arr2=int( [ 127, 0, 0, -127], kind=int8 )', & ' write(*,*)''arr1='',arr1', & ' write(*,*)''arr2='',arr2', & ' write(*, *)''bge(arr1,arr2)='',bge( arr1, arr2 )', & '', & ' ! SHOW TESTS AND BITS', & ' ! actually looking at the bit patterns should clarify what affect', & ' ! signs have ...', & ' write(*,*)''Compare some one-byte values to 64.''', & ' write(*,*)''Notice that the values are tested as bits not as integers''', & ' write(*,*)''so the results are as if values are unsigned integers.''', & ' do i=-128,127,32', & ' byte=i', & ' write(*,''(sp,i0.4,*(1x,1l,1x,b0.8))'')i,bge(byte,64_int8),byte', & ' enddo', & '', & ' ! SIGNED ZERO', & ' ! are +0 and -0 the same on your platform? When comparing at the', & ' ! bit level this is important', & ' write(*,''("plus zero=",b0)'') +0', & ' write(*,''("minus zero=",b0)'') -0', & '', & ' end program demo_bge', & '', & ' Results:', & '', & ' How an integer value is represented at the bit level can vary. These are', & ' just the values expected on Today''s most common platforms ...', & '', & ' > bge(-127,127)= T', & ' > bge(b"0001",2)= F', & ' > compare array of values [-128, -0, +0, 127] to 127', & ' > T F F T', & ' > compare two arrays', & ' > arr1= -127 0 0 127', & ' > arr2= 127 0 0 -127', & ' > bge(arr1,arr2)= T T T F', & ' > Compare some one-byte values to 64.', & ' > Notice that the values are tested as bits not as integers', & ' > so the results are as if values are unsigned integers.', & ' > -0128 T 10000000', & ' > -0096 T 10100000', & ' > -0064 T 11000000', & ' > -0032 T 11100000', & ' > +0000 F 00000000', & ' > +0032 F 00100000', & ' > +0064 T 01000000', & ' > +0096 T 01100000', & ' > plus zero=0', & ' > minus zero=0', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BGT(3), BLE(3), BLT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 bge(3fortran)', & ''] shortname="bge" call process() case('47','bgt') textblock=[character(len=256) :: & '', & 'bgt(3fortran) bgt(3fortran)', & '', & 'NAME', & ' BGT(3) - [BIT:COMPARE] Bitwise greater than', & '', & 'SYNOPSIS', & ' result = bgt(i, j)', & '', & ' elemental logical function bgt(i, j)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in) :: j', & '', & 'CHARACTERISTICS', & ' o I is an integer or a boz-literal-constant.', & '', & ' o J is an integer or a boz-literal-constant.', & '', & ' o a kind designated as ** may be any supported kind for the type The', & ' integer kind of I and J may not necessarily be the same. kind. In', & ' addition, values may be a BOZ constant with a value valid for the integer', & ' kind available with the most bits on the current platform.', & '', & ' o The return value is of type logical and of the default kind.', & '', & 'DESCRIPTION', & ' BGT determines whether an integer is bitwise greater than another. Bit-', & ' level representations of values are platform-dependent.', & '', & 'OPTIONS', & ' o I : reference value to compare against', & '', & ' o J : value to compare to I', & '', & 'RESULT', & ' The return value is of type logical and of the default kind. The result is', & ' true if the sequence of bits represented by i is greater than the sequence', & ' of bits represented by j, otherwise the result is false.', & '', & ' Bits are compared from right to left.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bgt', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: i', & ' integer(kind=int8) :: byte', & ' ! Compare some one-byte values to 64.', & ' ! Notice that the values are tested as bits not as integers', & ' ! so sign bits in the integer are treated just like any other', & ' write(*,''(a)'') ''we will compare other values to 64''', & ' i=64', & ' byte=i', & ' write(*,''(sp,i0.4,*(1x,1l,1x,b0.8))'')i,bgt(byte,64_int8),byte', & '', & ' write(*,''(a)'') "comparing at the bit level, not as whole numbers."', & ' write(*,''(a)'') "so pay particular attention to the negative"', & ' write(*,''(a)'') "values on this two''s complement platform ..."', & ' do i=-128,127,32', & ' byte=i', & ' write(*,''(sp,i0.4,*(1x,1l,1x,b0.8))'')i,bgt(byte,64_int8),byte', & ' enddo', & '', & ' ! see the BGE() description for an extended description', & ' ! of related information', & '', & ' end program demo_bgt', & '', & ' Results:', & '', & ' > we will compare other values to 64', & ' > +0064 F 01000000', & ' > comparing at the bit level, not as whole numbers.', & ' > so pay particular attention to the negative', & ' > values on this two''s complement platform ...', & ' > -0128 T 10000000', & ' > -0096 T 10100000', & ' > -0064 T 11000000', & ' > -0032 T 11100000', & ' > +0000 F 00000000', & ' > +0032 F 00100000', & ' > +0064 F 01000000', & ' > +0096 T 01100000', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BGE(3), BLE(3), BLT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 bgt(3fortran)', & ''] shortname="bgt" call process() case('48','bit_size') textblock=[character(len=256) :: & '', & 'bit_size(3fortran) bit_size(3fortran)', & '', & 'NAME', & ' BIT_SIZE(3) - [BIT:INQUIRY] Bit size inquiry function', & '', & 'SYNOPSIS', & ' result = bit_size(i)', & '', & ' integer(kind=KIND) function bit_size(i)', & '', & ' integer(kind=KIND),intent(in) :: i(..)', & '', & 'CHARACTERISTICS', & ' o I shall be of type integer. It may be a scalar or an array.', & '', & ' o the value of KIND is any valid value for an integer kind parameter on the', & ' processor.', & '', & ' o the return value is a scalar of the same kind as the input value.', & '', & 'DESCRIPTION', & ' BIT_SIZE(3) returns the number of bits (integer precision plus sign bit)', & ' represented by the type of the integer I.', & '', & 'OPTIONS', & ' o I : An integer value of any kind whose size in bits is to be determined.', & ' Because only the type of the argument is examined, the argument need not', & ' be defined; I can be a scalar or an array, but a scalar representing just', & ' a single element is always returned.', & '', & 'RESULT', & ' The number of bits used to represent a value of the type and kind of i. The', & ' result is a integer scalar of the same kind as i.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_bit_size', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' use,intrinsic :: iso_fortran_env, only : integer_kinds', & ' implicit none', & ' character(len=*),parameter :: fmt=&', & ' & ''(a,": bit size is ",i3," which is kind=",i3," on this platform")''', & '', & ' ! default integer bit size on this platform', & ' write(*,fmt) "default", bit_size(0), kind(0)', & '', & ' write(*,fmt) "int8 ", bit_size(0_int8), kind(0_int8)', & ' write(*,fmt) "int16 ", bit_size(0_int16), kind(0_int16)', & ' write(*,fmt) "int32 ", bit_size(0_int32), kind(0_int32)', & ' write(*,fmt) "int64 ", bit_size(0_int64), kind(0_int64)', & '', & ' write(*,''(a,*(i0:,", "))'') "The available kinds are ",integer_kinds', & '', & ' end program demo_bit_size', & '', & ' Typical Results:', & '', & ' > default: bit size is 32 which is kind= 4 on this platform', & ' > int8 : bit size is 8 which is kind= 1 on this platform', & ' > int16 : bit size is 16 which is kind= 2 on this platform', & ' > int32 : bit size is 32 which is kind= 4 on this platform', & ' > int64 : bit size is 64 which is kind= 8 on this platform', & ' > The available kinds are 1, 2, 4, 8, 16', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o BTEST(3) - Tests a bit of an integer value.', & '', & ' o STORAGE_SIZE(3) - Storage size in bits', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 bit_size(3fortran)', & ''] shortname="bit_size" call process() case('49','ble') textblock=[character(len=256) :: & '', & 'ble(3fortran) ble(3fortran)', & '', & 'NAME', & ' BLE(3) - [BIT:COMPARE] Bitwise less than or equal to', & '', & 'SYNOPSIS', & ' result = ble(i,j)', & '', & ' elemental logical function ble(i, j)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in) :: j', & '', & 'CHARACTERISTICS', & ' o I and J may be of any supported integer kind, not necessarily the same.', & ' An exception is that values may be a BOZ constant with a value valid for', & ' the integer kind available with the most bits on the current platform.', & '', & ' o the returned value is a logical scalar of default kind', & '', & 'DESCRIPTION', & ' BLE(3) determines whether an integer is bitwise less than or equal to', & ' another, assuming any shorter value is padded on the left with zeros to the', & ' length of the longer value.', & '', & 'OPTIONS', & ' o I : the value to compare J to', & '', & ' o J : the value to be tested for being less than or equal to I', & '', & 'RESULT', & ' The return value is .true. if any bit in J is less than any bit in I', & ' starting with the rightmost bit and continuing tests leftward.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ble', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: i', & ' integer(kind=int8) :: byte', & ' ! Compare some one-byte values to 64.', & ' ! Notice that the values are tested as bits not as integers', & ' ! so sign bits in the integer are treated just like any other', & ' do i=-128,127,32', & ' byte=i', & ' write(*,''(sp,i0.4,*(1x,1l,1x,b0.8))'')i,ble(byte,64_int8),byte', & ' write(*,''(sp,i0.4,*(4x,b0.8))'')64_int8,64_int8', & ' enddo', & '', & ' ! see the BGE() description for an extended description', & ' ! of related information', & '', & ' end program demo_ble', & '', & ' Results:', & '', & ' > -0128 F 10000000', & ' > +0064 01000000', & ' > -0096 F 10100000', & ' > +0064 01000000', & ' > -0064 F 11000000', & ' > +0064 01000000', & ' > -0032 F 11100000', & ' > +0064 01000000', & ' > +0000 T 00000000', & ' > +0064 01000000', & ' > +0032 T 00100000', & ' > +0064 01000000', & ' > +0064 T 01000000', & ' > +0064 01000000', & ' > +0096 F 01100000', & ' > +0064 01000000', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BGE(3), BGT(3), BLT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ble(3fortran)', & ''] shortname="ble" call process() case('50','block') textblock=[character(len=256) :: & '', & 'block(7fortran) block(7fortran)', & '', & 'NAME', & ' BLOCK(7f) - [EXECUTION CONTROL] block construct', & '', & 'SYNOPSIS', & ' Syntax:', & '', & ' [block-construct-name:] BLOCK', & ' [specification-part]', & ' ENDBLOCK [block-construct-name]', & '', & 'DESCRIPTION', & ' The BLOCK(7F) construct is an executable construct which may contain', & ' declarations, and may be exited using the EXIT(7F) statement.', & '', & ' Aside from the following restrictions a block construct is in many ways', & ' similiar to a contained procedure without parameters accept it is', & ' constructed in-line instead of after the body of the current procedure.', & '', & ' So if you are thinking about making a contained procedure that will be', & ' called once it will probably be clearer inlined using a block construct.', & '', & ' The specification-part of a BLOCK(7F) construct cannot contain a COMMON,', & ' EQUIVALENCE, IMPLICIT, INTENT, NAMELIST, or OPTIONAL statement.', & '', & ' A SAVE of a common-block-name is not allowed in a BLOCK(7F) construct.', & '', & ' Except for the ASYNCHRONOUS and VOLATILE statements, specifications in a', & ' BLOCK(7F) construct declare construct entities whose scope is that of the', & ' block construct.', & '', & 'EXAMPLES', & ' Sample programs:', & '', & ' program demo_block', & ' implicit none', & ' integer,parameter :: arr1(*)=[1,2,3,4,5,6,7]', & ' integer,parameter :: arr2(*)=[0,1,2,3,4,5,6,7]', & '', & ' ! so when you want error processing to be skipped', & ' ! if you exhaust a series of tries and really hate GOTO ...', & ' DEBUG: block', & ' integer :: icount', & ' do icount=1,100 ! look for answer up to 100 times', & ' if(icount.eq.40)exit DEBUG ! found answer, go on', & ' enddo', & ' ! never get here unless exhausted the DO loop', & ' write(*,*)''never found the answer''', & ' stop 3', & ' endblock DEBUG', & ' !', & ' call showme(arr1)', & ' call showme(arr2)', & ' !', & ' contains', & ' !', & ' subroutine showme(a)', & ' integer,intent(in) :: a(:)', & ' integer :: i=-100', & ' integer :: tan', & ' tan=20 ! intentionally cause a conflict with intrinsic', & ' ! cannot use tan(3f) right here because using name for a variable', & ' TESTFORZERO: block', & ' integer :: I ! local block variable', & ' intrinsic :: tan ! can use the TAN intrinsic in the block now', & ' ! as this definition supercedes the one in the', & ' ! parent body', & ' do i=1,size(a)', & ' if(a(i).eq.0) then', & ' write(*,*)''found zero at index'',i', & ' exit TESTFORZERO', & ' endif', & ' enddo', & ' write(*,*)''Never found a zero, tried '',i-1,'' times''', & ' return', & ' endblock TESTFORZERO', & ' ! note the variable I in the block is local to the block', & ' write(*,*)''this is the variable back in the main scope, I='',i', & ' end subroutine showme', & '', & ' end program demo_block', & '', & ' Results:', & '', & ' > Never found a zero, tried 7 times', & ' > found zero at index 1', & ' > this is the variable in the main scope of the program, I=-100', & '', & 'SEE ALSO', & ' o DO(3) - construct', & '', & ' o IF(3) - selects a block based on a sequence of logical expressions.', & '', & ' o CYCLE(3) - construct', & '', & ' o EXIT(3) - statement', & '', & ' o ASSOCIATE(3) - associate construct', & '', & ' o BLOCK(3) - construct', & '', & ' o GOTO(3) - jump to target line', & '', & ' o SELECT(3) - select a block based on the value of an expression (a case)', & '', & ' o CASE(3) - select a block based on the value of an expression (a case)', & '', & ' o ENDSELECT(3) - select a block based on the value of an expression (a', & ' case)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 block(7fortran)', & ''] shortname="block" call process() case('51','blt') textblock=[character(len=256) :: & '', & 'blt(3fortran) blt(3fortran)', & '', & 'NAME', & ' BLT(3) - [BIT:COMPARE] Bitwise less than', & '', & 'SYNOPSIS', & ' result = blt(i,j)', & '', & ' elemental logical function blt(i, j)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in) :: j', & '', & 'CHARACTERISTICS', & ' o I is an integer of any kind or a BOZ-literal-constant', & '', & ' o J is an integer of any kind or a BOZ-literal-constant, not necessarily', & ' the same as I.', & '', & ' o the result is of default logical kind', & '', & ' BOZ constants must have a value valid for the integer kind available with', & ' the most bits on the current platform.', & '', & 'DESCRIPTION', & ' BLT(3) determines whether an integer is bitwise less than another.', & '', & 'OPTIONS', & ' o I : Shall be of integer type or a BOZ literal constant.', & '', & ' o J : Shall be of integer type or a BOZ constant.', & '', & 'RESULT', & ' The return value is of type logical and of the default kind.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_blt', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: i', & ' integer(kind=int8) :: byte', & ' ! Compare some one-byte values to 64.', & ' ! Notice that the values are tested as bits not as integers', & ' ! so sign bits in the integer are treated just like any other', & ' do i=-128,127,32', & ' byte=i', & ' write(*,''(sp,i0.4,*(1x,1l,1x,b0.8))'')i,blt(byte,64_int8),byte', & ' enddo', & ' ! BOZ literals', & ' write(*,*)blt(z''1000'', z''101011010'')', & ' ! see the BGE() description for an extended description', & ' ! of related information', & '', & ' end program demo_blt', & '', & ' Results:', & '', & ' > -0128 F 10000000', & ' > -0096 F 10100000', & ' > -0064 F 11000000', & ' > -0032 F 11100000', & ' > +0000 T 00000000', & ' > +0032 T 00100000', & ' > +0064 F 01000000', & ' > +0096 F 01100000', & ' > T', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BGE(3), BGT(3), BLE(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 blt(3fortran)', & ''] shortname="blt" call process() case('52','btest') textblock=[character(len=256) :: & '', & 'btest(3fortran) btest(3fortran)', & '', & 'NAME', & ' BTEST(3) - [BIT:INQUIRY] Tests a bit of an integer value.', & '', & 'SYNOPSIS', & ' result = btest(i,pos)', & '', & ' elemental logical function btest(i,pos)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in) :: pos', & '', & 'CHARACTERISTICS', & ' o I is an integer of any kind', & '', & ' o POS is a integer of any kind', & '', & ' o the result is a default logical', & '', & 'DESCRIPTION', & ' BTEST(3) returns logical .true. if the bit at POS in I is set to 1.', & ' Position zero is the right-most bit. Bit position increases from right to', & ' left up to BITSIZE(I)-1.', & '', & 'OPTIONS', & ' o I : The integer containing the bit to be tested', & '', & ' o POS : The position of the bit to query. it must be a valid position for', & ' the value I; ie. 0 <= POS <= BIT_SIZE(I).', & '', & 'RESULT', & ' The result is a logical that has the value .true. if bit position POS of I', & ' has the value 1 and the value .false. if bit POS of I has the value 0.', & '', & ' Positions of bits in the sequence are numbered from right to left, with the', & ' position of the rightmost bit being zero.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_btest', & ' implicit none', & ' integer :: i, j, pos, a(2,2)', & ' logical :: bool', & ' character(len=*),parameter :: g=''(*(g0))''', & '', & ' i = 32768 + 1024 + 64', & ' write(*,''(a,i0,"=>",b32.32,/)'')''Looking at the integer: '',i', & '', & ' ! looking one bit at a time from LOW BIT TO HIGH BIT', & ' write(*,g)''from bit 0 to bit '',bit_size(i),''==>''', & ' do pos=0,bit_size(i)-1', & ' bool = btest(i, pos)', & ' write(*,''(l1)'',advance=''no'')bool', & ' enddo', & ' write(*,*)', & '', & ' ! a binary format the hard way.', & ' ! Note going from bit_size(i) to zero.', & ' write(*,*)', & ' write(*,g)''so for '',i,'' with a bit size of '',bit_size(i)', & ' write(*,''(b32.32)'')i', & ' write(*,g)merge(''^'',''_'',[(btest(i,j),j=bit_size(i)-1,0,-1)])', & ' write(*,*)', & ' write(*,g)''and for '',-i,'' with a bit size of '',bit_size(i)', & ' write(*,''(b32.32)'')-i', & ' write(*,g)merge(''^'',''_'',[(btest(-i,j),j=bit_size(i)-1,0,-1)])', & '', & ' ! elemental:', & ' !', & ' a(1,:)=[ 1, 2 ]', & ' a(2,:)=[ 3, 4 ]', & ' write(*,*)', & ' write(*,''(a,/,*(i2,1x,i2,/))'')''given the array a ...'',a', & ' ! the second bit of all the values in a', & ' write(*,''(a,/,*(l2,1x,l2,/))'')''the value of btest (a, 2)'',btest(a,2)', & ' ! bits 1,2,3,4 of the value 2', & ' write(*,''(a,/,*(l2,1x,l2,/))'')''the value of btest (2, a)'',btest(2,a)', & ' end program demo_btest', & '', & ' Results:', & '', & ' > Looking at the integer: 33856=>11111111111111110111101111000000', & ' >', & ' > 00000000000000001000010001000000', & ' > 11111111111111110111101111000000', & ' > 1000010001000000', & ' > 11111111111111110111101111000000', & ' > from bit 0 to bit 32==>', & ' > FFFFFFTFFFTFFFFTFFFFFFFFFFFFFFFF', & ' >', & ' > so for 33856 with a bit size of 32', & ' > 00000000000000001000010001000000', & ' > ________________^____^___^______', & ' >', & ' > and for -33856 with a bit size of 32', & ' > 11111111111111110111101111000000', & ' > ^^^^^^^^^^^^^^^^_^^^^_^^^^______', & ' >', & ' > given the array a ...', & ' > 1 3', & ' > 2 4', & ' >', & ' > the value of btest (a, 2)', & ' > F F', & ' > F T', & ' >', & ' > the value of btest (2, a)', & ' > T F', & ' > F F', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' IAND(3), IBCLR(3), IBITS(3), IBSET(3), IEOR(3), IOR(3), MVBITS(3), NOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 btest(3fortran)', & ''] shortname="btest" call process() case('53','c_associated') textblock=[character(len=256) :: & '', & 'c_associated(3fortran) c_associated(3fortran)', & '', & 'NAME', & ' C_ASSOCIATED(3) - [ISO_C_BINDING] Status of a C pointer', & '', & 'SYNOPSIS', & ' result = c_associated(c_prt_1, [c_ptr_2] )', & '', & ' logical function c_associated(c_prt_1, cptr_2)', & '', & ' TYPE,intent(in) ::c_ptr_1', & ' TYPE,intent(in),optional ::c_ptr_2', & '', & 'CHARACTERISTICS', & ' o C_PTR_1 is a scalar of the type c_ptr or c_funptr.', & '', & ' o C_PTR_2 is a scalar of the same type as c_ptr_1.', & '', & ' o The return value is of type logical', & '', & 'DESCRIPTION', & ' C_ASSOCIATED(3) determines the status of the C pointer c_ptr_1 or if c_ptr_1', & ' is associated with the target c_ptr_2.', & '', & 'OPTIONS', & ' o C_PTR_1 : C pointer to test for being a C NULL pointer, or to test if', & ' pointing to the same association as C_PTR_2 when present.', & '', & ' o C_PTR_2 : C pointer to test for shared association with C_PTR_1', & '', & 'RESULT', & ' The return value is of type logical; it is .false. if either c_ptr_1 is a C', & ' NULL pointer or if c_ptr1 and c_ptr_2 point to different addresses.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_c_associated', & '', & ' contains', & '', & ' subroutine association_test(a,b)', & ' use iso_c_binding, only: c_associated, c_loc, c_ptr', & ' implicit none', & ' real, pointer :: a', & ' type(c_ptr) :: b', & ' if(c_associated(b, c_loc(a))) &', & ' stop ''b and a do not point to same target''', & ' end subroutine association_test', & '', & ' end program demo_c_associated', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' C_LOC(3), C_FUNLOC(3), ISO_C_BINDING(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 c_associated(3fortran)', & ''] shortname="c_associated" call process() case('54','ceiling') textblock=[character(len=256) :: & '', & 'ceiling(3fortran) ceiling(3fortran)', & '', & 'NAME', & ' CEILING(3) - [NUMERIC] returns the least integer greater than or equal to A.', & '', & 'SYNOPSIS', & ' result = ceiling(a [,kind])', & '', & ' elemental integer(KIND) function ceiling(a,KIND)', & '', & ' real(kind=**),intent(in) :: a', & ' integer,intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o A is of type real', & '', & ' o if present KIND is a scalar integer constant expression that specifies', & ' the kind of the result.', & '', & ' o the result is integer. It is default kind if KIND is not specified', & '', & 'DESCRIPTION', & ' CEILING(3) returns the least integer greater than or equal to A.', & '', & ' On the number line -n <-- 0 -> +n the value returned is always at or to the', & ' right of the input value.', & '', & ' For example, ceil(0.5) is 1.0, and ceil(-0.5) is 0.0.', & '', & ' The input value may be too large to store the result in an integer type. To', & ' avoid an overflow (which produces an undefined result), an application', & ' should perform a range check on the input value before using ceiling(3).', & '', & 'OPTIONS', & ' o A : A real value to produce a ceiling for.', & '', & ' o KIND : indicates the kind parameter of the result.', & '', & 'RESULT', & ' The result will be the integer value equal to A or the least integer greater', & ' than A if the input value is not equal to a whole number.', & '', & ' If A is equal to a whole number, the returned value is INT(A).', & '', & ' The result is undefined if it cannot be represented in the specified integer', & ' type.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ceiling', & ' implicit none', & ' ! just a convenient format for a list of integers', & ' character(len=*),parameter :: gen=''(1x,*(g0:,1x))''', & ' real :: x', & ' real :: y', & ' integer :: ierr', & ' real,parameter :: arr(*)=[ &', & ' & -2.7, -2.5, -2.2, -2.0, -1.5, &', & ' & -1.0, -0.5, 0.0, +0.5, +1.0, &', & ' & +1.5, +2.0, +2.2, +2.5, +2.7 ]', & ' character(len=80) :: message', & ' print *, ''Basic Usage''', & ' x = 63.29', & ' y = -63.59', & ' print gen, ceiling(x), ceiling(y)', & ' ! note the result was the next integer larger to the right', & '', & ' print *, ''Whole Numbers'' ! real values equal to whole numbers', & ' x = 63.0', & ' y = -63.0', & ' print gen, ceiling(x), ceiling(y)', & '', & ' print *, ''Elemental'' ! (so an array argument is allowed)', & ' print gen , ceiling(arr)', & '', & ' print *, ''Advanced Usage'' ! Dealing with large magnitude values', & ' print ''(a)'',[character(len=80):: &', & ' ''Limits '',&', & ' ''You only care about Limits if you are using values near or above '',&', & ' ''the limits of the integer type you are using (see huge(3)). '',&', & ' '''',&', & ' ''Surprised by some of the following results? '',&', & ' ''What do real values clearly out of the range of integers return? '',&', & ' ''What do values near the end of the range of integers return? '',&', & ' ''The standard only specifies what happens for representable values'',&', & ' ''in the range of integer values. '',&', & ' '''',&', & ' ''It is common but not required that if the input is out of range '',&', & ' ''and positive the result is -huge(0) and -huge(0)-1 if negative. '',&', & ' ''Note you are out of range before you get to real(huge(0)). '',&', & ' '''' ]', & ' print gen , ''For reference: huge(0)='',huge(0),''-huge(0)-1='',-huge(0)-1', & '', & ' x=huge(0)', & ' call displayx()', & '', & ' x=2*x', & ' call displayx()', & '', & ' x=-huge(0)-1', & ' call displayx()', & '', & ' x=2*x', & ' call displayx()', & '', & ' print gen , repeat(''='',80)', & '', & ' contains', & '', & ' subroutine displayx()', & ' use,intrinsic :: iso_fortran_env, only: int8,int16,int32,int64', & ' print gen , repeat(''='',80)', & ' print gen , ''x='',x,'' spacing='',spacing(x)', & ' print gen , '' ceiling(x):'',ceiling(x)', & ' print gen , '' ceiling(x,kind=int64):'',ceiling(x,kind=int64)', & ' print gen , '' ceiling_robust(x):'',ceiling_robust(x,ierr,message)', & ' if(ierr.ne.0)then', & ' print gen, ierr,''=>'',trim(message)', & ' endif', & ' end subroutine displayx', & '', & ' elemental impure function ceiling_robust(x,ierr,message)', & ' ! return the least integer >= x', & ' use,intrinsic :: iso_fortran_env, only: int8,int16,int32,int64', & ' use,intrinsic :: iso_fortran_env, only: real32,real64,real128', & ' real,intent(in) :: x', & ' integer,intent(out),optional :: ierr', & ' character(len=*),intent(out),optional :: message', & ' character(len=80) :: message_local', & ' integer :: ceiling_robust', & ' integer :: ierr_local', & ' ierr_local=0', & ' message_local=''''', & ' ! allow -huge(0)-1 or not?', & ' if(spacing(x) > 128)then ! bounds checking', & ' if(x.ge.0)then', & ' write(message_local,*)''<ERROR>X='',x,'' >='',anint(real(huge(0)))', & ' ierr_local=1', & ' ceiling_robust=huge(0)', & ' else', & ' ierr_local=2', & ' ceiling_robust=-huge(0)-1', & ' write(message_local,*)''<ERROR>X='',x,'' <='',anint(real(-huge(0)-1))', & ' endif', & ' else', & ' ! used to use a computed goto to do this!', & ' ceiling_robust = int(x)', & ' if (x > 0.0) then', & ' if (real(ceiling_robust) < x)then', & ' ceiling_robust = ceiling_robust + 1', & ' endif', & ' endif', & ' endif', & ' if(present(ierr))then', & ' ierr=ierr_local', & ' elseif(ierr_local.ne.0)then', & ' stop message_local', & ' endif', & ' if(present(message))then', & ' message=message_local', & ' endif', & ' end function ceiling_robust', & '', & ' end program demo_ceiling', & '', & ' Results:', & '', & ' > Basic Usage', & ' > 64 -63', & ' > Whole Numbers', & ' > 63 -63', & ' > Elemental', & ' > -2 -2 -2 -2 -1 -1 0 0 1 1 2 2 3 3 3', & ' > Limits', & ' >', & ' > Surprised by some of the following results?', & ' > What do real values clearly out of the range of integers return?', & ' > What do values near the end of the range of integers return?', & ' > The standard only specifies what happens for representable values', & ' > in the range of integer values.', & ' >', & ' > It is common but not required that if the input is out of range', & ' > and positive the result is -huge(0) and -huge(0)-1 if negative.', & ' > Note you are out of range before you get to real(huge(0)).', & ' >', & ' > For reference: huge(0)= 2147483647 -huge(0)-1= -2147483648', & ' > ======================================================================', & ' > x= 0.214748365E+10 spacing= 256.000000', & ' > ceiling(x): -2147483647', & ' > ceiling(x,kind=int64): 2147483648', & ' > ceiling_robust(x): 2147483647', & ' > 1 => <ERROR>X= 2.14748365E+09 >= 2.14748365E+09', & ' > ======================================================================', & ' > x= 0.429496730E+10 spacing= 512.000000', & ' > ceiling(x): -2147483647', & ' > ceiling(x,kind=int64): 4294967296', & ' > ceiling_robust(x): 2147483647', & ' > 1 => <ERROR>X= 4.29496730E+09 >= 2.14748365E+09', & ' > ======================================================================', & ' > x= -0.214748365E+10 spacing= 256.000000', & ' > ceiling(x): -2147483648', & ' > ceiling(x,kind=int64): -2147483648', & ' > ceiling_robust(x): -2147483648', & ' > 2 => <ERROR>X= -2.14748365E+09 <= -2.14748365E+09', & ' > ======================================================================', & ' > x= -0.429496730E+10 spacing= 512.000000', & ' > ceiling(x): -2147483648', & ' > ceiling(x,kind=int64): -4294967296', & ' > ceiling_robust(x): -2147483648', & ' > 2 => <ERROR>X= -4.29496730E+09 <= -2.14748365E+09', & ' > ======================================================================', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' FLOOR(3), NINT(3)', & '', & ' AINT(3), ANINT(3), INT(3), SELECTED_INT_KIND(3)', & '', & ' NEAREST(3), SPACING(3), EPSILON(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ceiling(3fortran)', & ''] shortname="ceiling" call process() case('55','c_f_pointer') textblock=[character(len=256) :: & '', & 'c_f_pointer(3fortran) c_f_pointer(3fortran)', & '', & 'NAME', & ' C_F_POINTER(3) - [ISO_C_BINDING] Convert C into Fortran pointer', & '', & 'SYNOPSIS', & ' call c_f_pointer(cptr, fptr [,shape] )', & '', & ' subroutine c_f_pointer(cptr, fptr ,shape )', & '', & ' type(c_ptr),intent(in) :: cprt', & ' type(TYPE),pointer,intent(out) :: fprt', & ' integer,intent(in),optional :: shape(:)', & '', & 'CHARACTERISTICS', & ' The Fortran pointer FPRT must be interoperable with CPTR', & '', & ' SHAPE is only specified if FPTR is an array.', & '', & 'DESCRIPTION', & ' C_F_POINTER(3) assigns the target (the C pointer CPTR) to the Fortran', & ' pointer FPTR and specifies its shape if FPTR points to an array.', & '', & 'OPTIONS', & ' o CPTR : scalar of the type c_ptr. It is INTENT(IN).', & '', & ' o FPTR : pointer interoperable with CPTR. it is INTENT(OUT).', & '', & ' o SHAPE : (Optional) Rank-one array of type integer with INTENT(IN) . It', & ' shall be present if and only if FPTR is an array. The size must be equal', & ' to the rank of FPTR.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_c_f_pointer', & ' use iso_c_binding', & ' implicit none', & ' interface', & ' subroutine my_routine(p) bind(c,name=''myC_func'')', & ' import :: c_ptr', & ' type(c_ptr), intent(out) :: p', & ' end subroutine', & ' end interface', & ' type(c_ptr) :: cptr', & ' real,pointer :: a(:)', & ' call my_routine(cptr)', & ' call c_f_pointer(cptr, a, [12])', & ' end program demo_c_f_pointer', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' C_LOC(3), C_F_PROCPOINTER(3), ISO_C_BINDING(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 c_f_pointer(3fortran)', & ''] shortname="c_f_pointer" call process() case('56','c_f_procpointer') textblock=[character(len=256) :: & '', & 'c_f_procpointer(3fortran) c_f_procpointer(3fortran)', & '', & 'NAME', & ' C_F_PROCPOINTER(3) - [ISO_C_BINDING] Convert C into Fortran procedure', & ' pointer', & '', & 'SYNOPSIS', & ' call c_f_procpointer(cptr, fptr)', & '', & ' subroutine c_f_procpointer(cptr, fptr )', & '', & ' type(c_funptr),intent(in) :: cprt', & ' type(TYPE),pointer,intent(out) :: fprt', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' C_F_PROCPOINTER(3) assigns the target of the C function pointer CPTR to the', & ' Fortran procedure pointer FPTR.', & '', & 'OPTIONS', & ' o CPTR : scalar of the type c_funptr. It is INTENT(IN).', & '', & ' o FPTR : procedure pointer interoperable with CPTR. It is INTENT(OUT).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_c_f_procpointer', & ' use iso_c_binding', & ' implicit none', & ' abstract interface', & ' function func(a)', & ' import :: c_float', & ' real(c_float), intent(in) :: a', & ' real(c_float) :: func', & ' end function', & ' end interface', & ' interface', & ' function getIterFunc() bind(c,name="getIterFunc")', & ' import :: c_funptr', & ' type(c_funptr) :: getIterFunc', & ' end function', & ' end interface', & ' type(c_funptr) :: cfunptr', & ' procedure(func), pointer :: myFunc', & ' cfunptr = getIterFunc()', & ' call c_f_procpointer(cfunptr, myFunc)', & ' end program demo_c_f_procpointer', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' C_LOC(3), C_F_POINTER(3), ISO_C_BINDING(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 c_f_procpointer(3fortran)', & ''] shortname="c_f_procpointer" call process() case('57','c_funloc') textblock=[character(len=256) :: & '', & 'c_funloc(3fortran) c_funloc(3fortran)', & '', & 'NAME', & ' C_FUNLOC(3) - [ISO_C_BINDING] Obtain the C address of a procedure', & '', & 'SYNOPSIS', & ' result = c_funloc(x)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' C_FUNLOC(3) determines the C address of the argument.', & '', & 'OPTIONS', & ' o X : Interoperable function or pointer to such function.', & '', & 'RESULT', & ' The return value is of type c_funptr and contains the C address of the', & ' argument.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' ! program demo_c_funloc and module', & ' module x', & ' use iso_c_binding', & ' implicit none', & ' contains', & ' subroutine sub(a) bind(c)', & ' real(c_float) :: a', & ' a = sqrt(a)+5.0', & ' end subroutine sub', & ' end module x', & ' !', & ' program demo_c_funloc', & ' use iso_c_binding', & ' use x', & ' implicit none', & ' interface', & ' subroutine my_routine(p) bind(c,name=''myC_func'')', & ' import :: c_funptr', & ' type(c_funptr), intent(in) :: p', & ' end subroutine', & ' end interface', & ' call my_routine(c_funloc(sub))', & ' !', & ' end program demo_c_funloc', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' C_ASSOCIATED(3), C_LOC(3), C_F_POINTER(3),', & '', & ' C_F_PROCPOINTER(3), ISO_C_BINDING(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 c_funloc(3fortran)', & ''] shortname="c_funloc" call process() case('58','char') textblock=[character(len=256) :: & '', & 'char(3fortran) char(3fortran)', & '', & 'NAME', & ' CHAR(3) - [CHARACTER:CONVERSION] Generate a character from a code value', & '', & 'SYNOPSIS', & ' result = char(i [,kind])', & '', & ' elemental character(kind=KIND) function char(i,KIND)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o I is an integer of any kind', & '', & ' o KIND is an integer initialization expression indicating the kind', & ' parameter of the result.', & '', & ' o The returned value is a character with the kind specified by KIND or if', & ' KIND is not present, the default character kind.', & '', & 'DESCRIPTION', & ' Generates a character value given a numeric code representing the position I', & ' in the collating sequence associated with the specified kind KIND.', & '', & ' Note that ACHAR(3) is a similar function specifically for ASCII characters', & ' that is preferred when only ASCII is being processed, which is equivalent to', & ' CHAR(I,KIND=SELECTED_CHAR_KIND("ASCII") )', & '', & ' The ICHAR(3) function is the reverse of CHAR(3), converting characters to', & ' their collating sequence value.', & '', & 'OPTIONS', & ' o I : a value in the range 0 <= I <= N-1, where N is the number of', & ' characters in the collating sequence associated with the specified kind', & ' type parameter. : For ASCII, N is 127. The default character set may or', & ' may not allow higher values.', & '', & ' o KIND : A constant integer initialization expression indicating the kind', & ' parameter of the result. If not present, the default kind is assumed.', & '', & 'RESULT', & ' The return value is a single character of the specified kind, determined by', & ' the position of I in the collating sequence associated with the specified', & ' KIND.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_char', & ' implicit none', & ' integer, parameter :: ascii = selected_char_kind ("ascii")', & ' character(len=1, kind=ascii ) :: c, esc', & ' integer :: i', & ' ! basic', & ' i=74', & ' c=char(i)', & ' write(*,*)''ASCII character '',i,''is '',c', & ' write(*,''(*(g0))'')''Uppercase ASCII: '',(char(i),i=65,90)', & ' write(*,''(*(g0))'')''lowercase ASCII: '',(char(i),i=97,122)', & ' esc=char(27)', & ' write(*,''(*(g0))'')''Elemental: '',char([65,97,90,122])', & ' !', & ' print *, ''a selection of ASCII characters (shows hex if not printable)''', & ' do i=0,127,10', & ' c = char(i,kind=ascii)', & ' select case(i)', & ' case(32:126)', & ' write(*,''(i3,1x,a)'')i,c', & ' case(0:31,127)', & ' ! print hexadecimal value for unprintable characters', & ' write(*,''(i3,1x,z2.2)'')i,c', & ' case default', & ' write(*,''(i3,1x,a,1x,a)'')i,c,''non-standard ASCII''', & ' end select', & ' enddo', & '', & ' end program demo_char', & '', & ' Results:', & '', & ' > ASCII character 74 is J', & ' > Uppercase ASCII: ABCDEFGHIJKLMNOPQRSTUVWXYZ', & ' > lowercase ASCII: abcdefghijklmnopqrstuvwxyz', & ' > Elemental: AaZz', & ' > a selection of ASCII characters (shows hex if not printable)', & ' > 0 00', & ' > 10 0A', & ' > 20 14', & ' > 30 1E', & ' > 40 (', & ' > 50 2', & ' > 60 <', & ' > 70 F', & ' > 80 P', & ' > 90 Z', & ' > 100 d', & ' > 110 n', & ' > 120 x', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' ACHAR(3), IACHAR(3), ICHAR(3)', & '', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 char(3fortran)', & ''] shortname="char" call process() case('59','c_loc') textblock=[character(len=256) :: & '', & 'c_loc(3fortran) c_loc(3fortran)', & '', & 'NAME', & ' C_LOC(3) - [ISO_C_BINDING] Obtain the C address of an object', & '', & 'SYNOPSIS', & ' result = c_loc(x)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' C_LOC(3) determines the C address of the argument.', & '', & 'OPTIONS', & ' o X : Shall have either the pointer or target attribute. It shall not be a', & ' coindexed object. It shall either be a variable with interoperable type', & ' and kind type parameters, or be a scalar, nonpolymorphic variable with no', & ' length type parameters.', & '', & 'RESULT', & ' The return value is of type c_ptr and contains the C address of the', & ' argument.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' subroutine association_test(a,b)', & ' use iso_c_binding, only: c_associated, c_loc, c_ptr', & ' implicit none', & ' real, pointer :: a', & ' type(c_ptr) :: b', & ' if(c_associated(b, c_loc(a))) &', & ' stop ''b and a do not point to same target''', & ' end subroutine association_test', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' C_ASSOCIATED(3), C_FUNLOC(3), C_F_POINTER(3),', & '', & ' C_F_PROCPOINTER(3), ISO_C_BINDING(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 c_loc(3fortran)', & ''] shortname="c_loc" call process() case('60','close') textblock=[character(len=256) :: & '', & 'close(7fortran) close(7fortran)', & '', & 'NAME', & ' close(7f) - [IO] terminate the connection of a specified unit to an external', & ' file.', & '', & 'SYNOPSIS', & ' CLOSE ( [UNIT= ] file-unit-number,', & '', & ' [IOSTAT= scalar-int-variable,]', & ' [IOMSG= iomsg-variable,]', & ' [ERR= label,]', & ' [STATUS= scalar-default-char-expr]', & ' )', & '', & 'DESCRIPTION', & ' The CLOSE statement is used to terminate the connection of a specified unit', & ' to an external file.', & '', & ' Execution of a CLOSE statement for a unit may occur in any program unit of a', & ' program and need not occur in the same program unit as the execution of an', & ' OPEN statement referring to that unit.', & '', & ' Execution of a CLOSE statement performs a wait operation for any pending', & ' asynchronous data transfer operations for the specified unit.', & '', & ' Execution of a CLOSE statement specifying a unit that does not exist or has', & ' no file connected to it is permitted and affects no file or unit.', & '', & ' After a unit has been disconnected by execution of a CLOSE statement, it may', & ' be connected again within the same program, either to the same file or to a', & ' different file. After a named file has been disconnected by execution of a', & ' CLOSE statement, it may be connected again within the same program, either', & ' to the same unit or to a different unit, provided that the file still', & ' exists.', & '', & ' The input/output statements are the OPEN, CLOSE, READ, WRITE, PRINT,', & ' BACKSPACE, ENDFILE, REWIND, FLUSH, WAIT, and INQUIRE statements.', & '', & ' OPEN, CLOSE, BACKSPACE, ENDFILE, and REWIND statements shall not be executed', & ' while a parent data transfer statement is active.', & '', & ' A pure subprogram shall not contain a print-stmt, open-stmt, close-stmt,', & ' backspace-stmt, endfile-stmt, rewind-stmt, flush-stmt, wait-stmt, or', & ' inquire-stmt.', & '', & ' The READ statement is a data transfer input statement. The WRITE statement', & ' and the PRINT statement are data transfer output statements. The OPEN', & ' statement and the CLOSE statement are file connection statements. The', & ' INQUIRE statement is a file inquiry statement. The BACKSPACE, ENDFILE, and', & ' REWIND statements are file positioning statements.', & '', & ' All input/output statements may refer to files that exist. An INQUIRE, OPEN,', & ' CLOSE, WRITE, PRINT, REWIND, FLUSH, or ENDFILE statement also may refer to a', & ' file that does not exist. Execution of a WRITE, PRINT, or ENDFILE statement', & ' referring to a preconnected file that does not exist creates the file. This', & ' file is a different file from one preconnected on any other image.', & '', & ' AT PROGRAM TERMINATION During the completion step of termination of', & ' execution of a program, all units that are connected are closed. Each unit', & ' is closed with status KEEP unless the file status prior to termination of', & ' execution was SCRATCH, in which case the unit is closed with status DELETE.', & '', & ' The effect is as though a CLOSE statement without a STATUS= specifier were', & ' executed on each connected unit.', & '', & 'OPTIONS', & ' No specifier shall appear more than once in a given close-spec-list.', & '', & ' UNIT=file-unit-number : A file-unit-number shall be specified in a close-', & ' spec-list; if the optional characters UNIT= are omitted, the file-unit-', & ' number shall be the first item in the close-spec-list. IOSTAT=scalar-int-', & ' variable : 0 means no error occurred IOMSG=iomsg-variable : Character', & ' variable to hold message if an error occurred. ERR=label : The label used in', & ' the ERR= specifier shall be the statement label of a branch target statement', & ' that appears in the same scoping unit as the CLOSE statement. STATUS=scalar-', & ' default-char-expr : The expression has a limited list of character values.', & ' Any trailing blanks are ignored. The value specified is without regard to', & ' case.', & '', & ' The scalar-default-char-expr shall evaluate to KEEP or DELETE. The', & ' STATUS= specifier determines the disposition of the file that', & ' is connected to the specified unit. KEEP shall not be specified', & ' for a file whose status prior to execution of a CLOSE statement', & ' is SCRATCH. If KEEP is specified for a file that exists, the file', & ' continues to exist after the execution of a CLOSE statement. If KEEP', & ' is specified for a file that does not exist, the file will not exist', & ' after the execution of a CLOSE statement. If DELETE is specified,', & ' the file will not exist after the execution of a CLOSE statement. If', & ' this specifier is omitted, the default value is KEEP, unless the', & ' file status prior to execution of the CLOSE statement is SCRATCH,', & ' in which case the default value is DELETE.', & '', & 'EXAMPLES', & ' sample program:', & '', & ' program demo_close', & ' implicit none', & ' character(len=256) :: message', & ' integer :: ios', & ' open (10, file=''employee.names'', action=''read'', &', & ' & iostat=ios,iomsg=message)', & ' if (ios < 0) then', & ' ! perform error processing on the unit 10 file.', & ' close (10, status=''keep'',iostat=ios,iomsg=message)', & ' if(ios.ne.0)then', & ' write(*,''(*(a))'')''*demo_close* close error: '',trim(message)', & ' stop 1', & ' endif', & ' elseif (ios > 0) then', & ' ! perform error processing on open', & ' write(*,''(*(a))'')''*demo_close* open error: '',trim(message)', & ' stop 2', & ' endif', & ' end program demo_close', & '', & 'SEE ALSO', & ' BACKSPACE(7), CLOSE(7), ENDFILE(7), FLUSH(7), INQUIRE(7), OPEN(7), PRINT(7),', & ' READ(7), REWIND(7), WAIT(7), WRITE(7)', & '', & ' March 16, 2025 close(7fortran)', & ''] shortname="close" call process() case('61','cmplx') textblock=[character(len=256) :: & '', & 'cmplx(3fortran) cmplx(3fortran)', & '', & 'NAME', & ' CMPLX(3) - [TYPE:CONVERSION] Conversion to a complex type', & '', & 'SYNOPSIS', & ' result = cmplx(x [,kind]) | cmplx(x [,y] [,kind])', & '', & ' elemental complex(kind=KIND) function cmplx( x, y, kind )', & '', & ' type(TYPE(kind=**)),intent(in) :: x', & ' type(TYPE(kind=**)),intent(in),optional :: y', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o X may be integer, real, or complex.', & '', & ' o Y may be integer or real. Y is allowed only if X is not complex.', & '', & ' o KIND is a constant integer initialization expression indicating the kind', & ' parameter of the result.', & '', & ' The type of the arguments does not affect the kind of the result except for', & ' a complex X value.', & '', & ' o if KIND is not present and X is complex the result is of the kind of X.', & '', & ' o if KIND is not present and X is not complex the result if of default', & ' complex kind.', & '', & ' NOTE: a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' The CMPLX(3) function converts numeric values to a complex value.', & '', & ' Even though constants can be used to define a complex variable using syntax', & ' like', & '', & ' z = (1.23456789, 9.87654321)', & '', & ' this will not work for variables. So you cannot enter', & '', & ' z = (a, b) ! NO ! (unless a and b are constants, not variables)', & '', & ' so to construct a complex value using non-complex values you must use the', & ' CMPLX(3) function:', & '', & ' z = cmplx(a, b)', & '', & ' or assign values separately to the imaginary and real components using the', & ' %IM and %RE designators:', & '', & ' z%re = a', & ' z%im = b', & '', & ' If X is complex Y is not allowed and CMPLX essentially returns the input', & ' value except for an optional change of kind, which can be useful when', & ' passing a value to a procedure that requires the arguments to have a', & ' different kind (and does not return an altered value):', & '', & ' call something(cmplx(z,kind=real64))', & '', & ' would pass a copy of a value with kind=real64 even if z had a different kind', & '', & ' but otherwise is equivalent to a simple assign. So if z1 and z2 were', & ' complex:', & '', & ' z2 = z1 ! equivalent statements', & ' z2 = cmplx(z1)', & '', & ' If X is not complex X is only used to define the real component of the', & ' result but Y is still optional -- the imaginary part of the result will just', & ' be assigned a value of zero.', & '', & ' If Y is present it is converted to the imaginary component.', & '', & ' CMPLX(3) AND DOUBLE PRECISION', & '', & ' Primarily in order to maintain upward compatibility you need to be careful', & ' when working with complex values of higher precision that the default.', & '', & ' It was necessary for Fortran to continue to specify that CMPLX(3) always', & ' return a result of the default kind if the KIND option is absent, since that', & ' is the behavior mandated by FORTRAN 77.', & '', & ' It might have been preferable to use the highest precision of the arguments', & ' for determining the return kind, but that is not the case. So with arguments', & ' with greater precision than default values you are required to use the KIND', & ' argument or the greater precision values will be reduced to default', & ' precision.', & '', & ' This means CMPLX(D1,D2), where D1 and D2 are doubleprecision, is treated as:', & '', & ' cmplx(sngl(d1), sngl(d2))', & '', & ' which looses precision.', & '', & ' So Fortran 90 extends the CMPLX(3) intrinsic by adding an extra argument', & ' used to specify the desired kind of the complex result.', & '', & ' integer,parameter :: dp=kind(0.0d0)', & ' complex(kind=dp) :: z8', & ' ! wrong ways to specify constant values ! note this was stored with default', & ' real precision ! z8 = cmplx(1.2345678901234567d0, 1.2345678901234567d0)', & ' print *, ''NO, Z8='',z8,real(z8),aimag(z8)', & '', & ' z8 = cmplx(1.2345678901234567e0_dp, 1.2345678901234567e0_dp) ! again, note', & ' output components are just real print *, ''NO, Z8='',z8,real(z8),aimag(z8) !', & ' ! YES ! ! kind= makes it work z8 = cmplx(1.2345678901234567d0,', & ' 1.2345678901234567d0,kind=dp) print *, ''YES, Z8='',z8,real(z8),aimag(z8)', & '', & ' A more recent alternative to using CMPLX(3) is "F2018 component syntax"', & ' where real and imaginary parts of a complex entity can be accessed', & ' independently:', & '', & ' value%RE ! %RE specifies the real part', & ' or', & ' value%IM ! %IM specifies the imaginary part', & '', & ' Where the designator value is of course of complex type.', & '', & ' The type of a complex-part-designator is real, and its kind and shape are', & ' those of the designator. That is, you retain the precision of the complex', & ' value by default, unlike with CMPLX.', & '', & ' The following are examples of complex part designators:', & '', & ' impedance%re !-- Same value as real(impedance)', & ' fft%im !-- Same value as AIMAG(fft)', & ' x%im = 0.0 !-- Sets the imaginary part of x to zero', & ' x(1:2)%re=[10,20] !-- even if x is an array', & '', & ' NOTE for I/O', & '', & ' Note that if format statements are specified a complex value is treated as', & ' two real values.', & '', & ' For list-directed I/O (ie. using an asterisk for a format) and NAMELIST', & ' output the values are expected to be delimited by "(" and ")" and of the', & ' form "(real_part,imaginary_part)". For NAMELIST input parenthesized values', & ' or lists of multiple real values are acceptable.', & '', & 'OPTIONS', & ' o X : The value assigned to the real component of the result when X is not', & ' complex.', & '', & ' If X is complex, the result is the same as if the real part of the input', & ' was passed as X and the imaginary part as Y.', & '', & ' result = CMPLX (REAL (X), AIMAG (X), KIND).', & '', & ' That is, a complex X value is copied to the result value with a possible', & ' change of kind.', & '', & ' o Y : Y is only allowed if X is not complex. Its value is assigned to the', & ' imaginary component of the result and defaults to a value of zero if', & ' absent.', & '', & ' o KIND : An integer initialization expression indicating the kind parameter', & ' of the result.', & '', & 'RESULT', & ' The return value is of complex type, with magnitudes determined by the', & ' values X and Y.', & '', & ' The common case when X is not complex is that the real component of the', & ' result is assigned the value of X and the imaginary part is zero or the', & ' value of Y if Y is present.', & '', & ' When X is complex Y is not allowed and the result is the same value as X', & ' with a possible change of kind. That is, the real part is REAL(X, KIND) and', & ' the imaginary part is REAL(Y, KIND).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_aimag', & ' implicit none', & ' integer,parameter :: dp=kind(0.0d0)', & ' real(kind=dp) :: precise', & ' complex(kind=dp) :: z8', & ' complex :: z4, zthree(3)', & ' precise=1.2345678901234567d0', & '', & ' ! basic', & ' z4 = cmplx(-3)', & ' print *, ''Z4='',z4', & ' z4 = cmplx(1.23456789, 1.23456789)', & ' print *, ''Z4='',z4', & ' ! with a format treat a complex as two real values', & ' print ''(1x,g0,1x,g0,1x,g0)'',''Z4='',z4', & '', & ' ! working with higher precision values', & ' ! using kind=dp makes it keep DOUBLEPRECISION precision', & ' ! otherwise the result would be of default kind', & ' z8 = cmplx(precise, -precise )', & ' print *, ''lost precision Z8='',z8', & ' z8 = cmplx(precise, -precise ,kind=dp)', & ' print *, ''kept precision Z8='',z8', & '', & ' ! assignment of constant values does not require cmplx(3)00', & ' ! The following is intuitive and works without calling cmplx(3)', & ' ! but does not work for variables just constants', & ' z8 = (1.1111111111111111d0, 2.2222222222222222d0 )', & ' print *, ''Z8 defined with constants='',z8', & '', & ' ! what happens when you assign a complex to a real?', & ' precise=z8', & ' print *, ''LHS='',precise,''RHS='',z8', & '', & ' ! elemental', & ' zthree=cmplx([10,20,30],-1)', & ' print *, ''zthree='',zthree', & '', & ' ! descriptors are an alternative', & ' zthree(1:2)%re=[100,200]', & ' print *, ''zthree='',zthree', & '', & ' end program demo_aimag', & '', & ' Results:', & '', & ' > Z4= (-3.000000,0.0000000E+00)', & ' > Z4= (1.234568,1.234568)', & ' > Z4= 1.234568 1.234568', & ' > lost precision Z8= (1.23456788063049,-1.23456788063049)', & ' > kept precision Z8= (1.23456789012346,-1.23456789012346)', & ' > Z8 defined with constants= (1.11111111111111,2.22222222222222)', & ' > LHS= 1.11111111111111 RHS= (1.11111111111111,2.22222222222222)', & ' > zthree= (10.00000,-1.000000) (20.00000,-1.000000) (30.00000,-1.000000)', & ' > zthree= (100.0000,-1.000000) (200.0000,-1.000000) (30.00000,-1.000000)', & '', & 'STANDARD', & ' FORTRAN 77, KIND added in Fortran 90.', & '', & 'SEE ALSO', & ' o AIMAG(3) - Imaginary part of complex number', & '', & ' o CONJG(3) - Complex conjugate function', & '', & ' o REAL(3) - Convert to real type', & '', & ' Fortran has strong support for complex values, including many intrinsics', & ' that take or produce complex values in addition to algebraic and logical', & ' expressions:', & '', & ' ABS(3), ACOSH(3), ACOS(3), ASINH(3), ASIN(3), ATAN2(3), ATANH(3), ATAN(3),', & ' COSH(3), COS(3), CO_SUM(3), DBLE(3), DOT_PRODUCT(3), EXP(3), INT(3),', & ' IS_CONTIGUOUS(3), KIND(3), LOG(3), MATMUL(3), PRECISION(3), PRODUCT(3),', & ' RANGE(3), RANK(3), SINH(3), SIN(3), SQRT(3), STORAGE_SIZE(3), SUM(3),', & ' TANH(3), TAN(3), UNPACK(3),', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 cmplx(3fortran)', & ''] shortname="cmplx" call process() case('62','co_broadcast') textblock=[character(len=256) :: & '', & 'co_broadcast(3fortran) co_broadcast(3fortran)', & '', & 'NAME', & ' CO_BROADCAST(3) - [COLLECTIVE] Copy a value to all images the current set of', & ' images', & '', & 'SYNOPSIS', & ' call co_broadcast(a, source_image [,stat] [,errmsg] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' CO_BROADCAST(3) copies the value of argument A on the image with image index', & ' source_image to all images in the current team. A becomes defined as if by', & ' intrinsic assignment. If the execution was successful and STAT is present,', & ' it is assigned the value zero. If the execution failed, STAT gets assigned a', & ' nonzero value and, if present, ERRMSG gets assigned a value describing the', & ' occurred error.', & '', & 'OPTIONS', & ' o A : INTENT(INOUT) argument; shall have the same dynamic type and type', & ' parameters on all images of the current team. If it is an array, it shall', & ' have the same shape on all images.', & '', & ' o SOURCE_IMAGE : a scalar integer expression. It shall have the same the', & ' same value on all images and refer to an image of the current team.', & '', & ' o STAT : (optional) a scalar integer variable', & '', & ' o ERRMSG : (optional) a scalar character variable', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_co_broadcast', & ' implicit none', & ' integer :: val(3)', & ' if (this_image() == 1) then', & ' val = [1, 5, 3]', & ' endif', & ' call co_broadcast (val, source_image=1)', & ' print *, this_image(), ":", val', & ' end program demo_co_broadcast', & '', & 'STANDARD', & ' Fortran xx', & '', & 'SEE ALSO', & ' CO_MAX(3), CO_MIN(3), CO_SUM(3), CO_REDUCE(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 co_broadcast(3fortran)', & ''] shortname="co_broadcast" call process() case('63','co_lbound') textblock=[character(len=256) :: & '', & 'co_lbound(3fortran) co_lbound(3fortran)', & '', & 'NAME', & ' CO_LBOUND(3) - [COLLECTIVE] Lower codimension bounds of an array', & '', & 'SYNOPSIS', & ' result = co_lbound( coarray [,dim] [,kind] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' CO_LBOUND(3) returns the lower bounds of a coarray, or a single lower', & ' cobound along the DIM codimension.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an coarray, of any type.', & '', & ' o DIM : (Optional) Shall be a scalar integer.', & '', & ' o KIND : (Optional) An integer initialization expression indicating the', & ' kind parameter of the result.', & '', & 'RESULT', & ' The return value is of type integer and of kind KIND. If KIND is absent, the', & ' return value is of default integer kind. If DIM is absent, the result is an', & ' array of the lower cobounds of COARRAY. If DIM is present, the result is a', & ' scalar corresponding to the lower cobound of the array along that', & ' codimension.', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' CO_UBOUND(3), LBOUND(3)', & '', & ' fortran-lang intrinsic descriptions', & '', & ' February 18, 2023 co_lbound(3fortran)', & ''] shortname="co_lbound" call process() case('64','co_max') textblock=[character(len=256) :: & '', & 'co_max(3fortran) co_max(3fortran)', & '', & 'NAME', & ' CO_MAX(3) - [COLLECTIVE] Maximal value on the current set of images', & '', & 'SYNOPSIS', & ' call co_max(a, result_image [,stat] [,errmsg] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' CO_MAX(3) determines element-wise the maximal value of A on all images of', & ' the current team. If result_image is present, the maximum values are', & ' returned in A on the specified image only and the value of A on the other', & ' images become undefined. If result_image is not present, the value is', & ' returned on all images. If the execution was successful and STAT is present,', & ' it is assigned the value zero. If the execution failed, STAT gets assigned a', & ' nonzero value and, if present, ERRMSG gets assigned a value describing the', & ' occurred error.', & '', & 'OPTIONS', & ' o A : shall be an integer, real or character variable, which has the same', & ' type and type parameters on all images of the team.', & '', & ' o RESULT_IMAGE : (optional) a scalar integer expression; if present, it', & ' shall have the same the same value on all images and refer to an image of', & ' the current team.', & '', & ' o STAT : (optional) a scalar integer variable', & '', & ' o ERRMSG : (optional) a scalar character variable', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_co_max', & ' implicit none', & ' integer :: val', & ' val = this_image()', & ' call co_max(val, result_image=1)', & ' if (this_image() == 1) then', & ' write(*,*) "Maximal value", val ! prints num_images()', & ' endif', & ' end program demo_co_max', & '', & ' Results:', & '', & ' > Maximal value 2', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' CO_MIN(3), CO_SUM(3), CO_REDUCE(3), CO_BROADCAST(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 co_max(3fortran)', & ''] shortname="co_max" call process() case('65','co_min') textblock=[character(len=256) :: & '', & 'co_min(3fortran) co_min(3fortran)', & '', & 'NAME', & ' CO_MIN(3) - [COLLECTIVE] Minimal value on the current set of images', & '', & 'SYNOPSIS', & ' call co_min(a, result_image [,stat] [,errmsg] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' CO_MIN(3) determines element-wise the minimal value of A on all images of', & ' the current team. If result_image is present, the minimal values are', & ' returned in A on the specified image only and the value of A on the other', & ' images become undefined. If result_image is not present, the value is', & ' returned on all images. If the execution was successful and STAT is present,', & ' it is assigned the value zero. If the execution failed, STAT gets assigned a', & ' nonzero value and, if present, ERRMSG gets assigned a value describing the', & ' occurred error.', & '', & 'OPTIONS', & ' o A : shall be an integer, real or character variable, which has the same', & ' type and type parameters on all images of the team.', & '', & ' o RESULT_IMAGE : (optional) a scalar integer expression; if present, it', & ' shall have the same the same value on all images and refer to an image of', & ' the current team.', & '', & ' o STAT : (optional) a scalar integer variable', & '', & ' o ERRMSG : (optional) a scalar character variable', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_co_min', & ' implicit none', & ' integer :: val', & ' val = this_image()', & ' call co_min(val, result_image=1)', & ' if (this_image() == 1) then', & ' write(*,*) "Minimal value", val ! prints 1', & ' endif', & ' end program demo_co_min', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' CO_MAX(3), CO_SUM(3), CO_REDUCE(3), CO_BROADCAST(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 co_min(3fortran)', & ''] shortname="co_min" call process() case('66','command_argument_count') textblock=[character(len=256) :: & '', & 'command_argument_count(3fortran) command_argument_count(3fortran)', & '', & 'NAME', & ' COMMAND_ARGUMENT_COUNT(3) - [SYSTEM:COMMAND LINE] Get number of command line', & ' arguments', & '', & 'SYNOPSIS', & ' result = command_argument_count()', & '', & ' integer function command_argument_count()', & '', & 'CHARACTERISTICS', & ' o the result is of default integer scalar.', & '', & 'DESCRIPTION', & ' COMMAND_ARGUMENT_COUNT(3) returns the number of arguments passed on the', & ' command line when the containing program was invoked.', & '', & 'OPTIONS', & ' None', & '', & 'RESULT', & ' The return value is of type default integer. It is the number of arguments', & ' passed on the command line when the program was invoked.', & '', & ' If there are no command arguments available or if the processor does not', & ' support command arguments, then the result has the value zero.', & '', & ' If the processor has a concept of a command name, the command name does not', & ' count as one of the command arguments.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_command_argument_count', & ' implicit none', & ' integer :: count', & ' count = command_argument_count()', & ' print *, count', & ' end program demo_command_argument_count', & '', & ' Sample output:', & '', & ' # the command verb does not count', & ' ./test_command_argument_count', & ' 0', & ' # quoted strings may count as one argument', & ' ./test_command_argument_count count arguments', & ' 2', & ' ./test_command_argument_count ''count arguments''', & ' 1', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' GET_COMMAND(3), GET_COMMAND_ARGUMENT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025command_argument_count(3fortran)', & ''] shortname="command_argument_count" call process() case('67','comment') textblock=[character(len=256) :: & '', & 'comment(5fortran) comment(5fortran)', & '', & 'NAME', & ' COMMENT(5) - [SYNTAX] code annotation', & '', & 'SYNOPSIS', & ' Fixed and Free comments', & '', & ' C fixed-format comment', & ' ! free-format comment', & ' ! free-format comment', & ' CODE_LINE ! free-format comment', & '', & 'DESCRIPTION', & ' In free-format files The character "!" initiates a comment except when it', & ' appears in a character context as part of a literal string.', & '', & ' The comment extends to the end of the line.', & '', & ' If the first nonblank character on a line is an "!", the line is a "comment', & ' line". Lines containing only blanks or containing no characters are also', & ' comment lines.', & '', & ' "comment lines" may appear anywhere. There are a few restrictions on', & ' comments trailing statements or continued statements though.', & '', & ' Comments may appear anywhere in a program unit and may precede the first', & ' statement of a program unit or follow the last statement of a program unit.', & '', & ' Comments have no effect on the interpretation of the program unit.', & '', & ' A continued line ending in an ampersand can additionally be followed by an', & ' exclamation and remarks unless a literal string is being continued.', & '', & ' Comment lines cannot be continued with an ampersand. An ampersand appearing', & ' in a comment has no special effect and is merely a regular character.', & '', & ' The standard does not restrict the number of consecutive comment lines.', & '', & ' FIXED-FORMAT SOURCE FILES', & '', & ' Additionally, in fixed-format source files a "C" in column 1 indicates the', & ' remainder of the line is a comment. An asterisk "*" in column 1 beginning a', & ' comment is a common extension as well.', & '', & ' There is a conflict in fixed-format files that can occur with the otherwise', & ' universal rule that at exclamation outside of a literal string begins a', & ' comment -- If the first non-blank character in a line is in column 6 in a', & ' fixed-format file it is a continuation line, not a comment. This rule', & ' includes an exclamation character as well.', & '', & 'FREE FORM COMMENTARY', & ' A comment is explanatory text embedded in program source intended to help', & ' human readers understand it.', & '', & ' Code completely without comments is often hard to read, but code with too', & ' many comments is also bad, especially if the comments are not kept up-to-', & ' date with changes to the code.', & '', & ' Too much commenting may mean that the code is over-complicated.', & '', & ' A good rule is to comment everything that needs it but write code that', & ' doesn''t need much of it.', & '', & ' Comments that explain WHY something is done and how the code relates to its', & ' environment are useful.', & '', & ' A particularly irksome form of over-commenting explains exactly what each', & ' statement does, even when it is obvious to any reasonably competant', & ' programmer.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_comment', & ' integer :: values(8)', & ' character(len=:),allocatable :: string', & ' character(len=1),parameter :: dash=''-'',colon='':'',dot=''.''', & ' real :: x=3.0, y=4.0', & ' ! comments may appear on a continued line', & ' ! blank lines are comment lines', & ' call date_and_time(values=values)', & ' associate( &', & '', & ' ! DATE', & ' YR=>values(1), & ! The year', & ' MO=>values(2), & ! The month', & ' DY=>values(3), & ! The day of the month', & '', & ' ! TIME', & ' UTC=>values(4), & ! Time difference with UTC in minutes', & ' HR=>values(5), & ! The hour of the day', & ' MIN=>values(6), & ! The minutes of the hour', & ' SEC=>values(7), & ! The seconds of the minute', & ' MILLI=>values(8) ) ! The milliseconds of the second', & '', & ' write(*,''(*(g0))'')YR,dash,MO,dash,DY,''T'', &', & ' & HR,colon,MIN,colon,SEC,dot,MILLI', & ' end associate', & '', & ' string=''no comment allowed &', & ' &on the end of a continued string &', & ' ! keep going ...', & ' & but comment lines are allowed between '' ! but can go on the end', & '', & ' ! the next exclamation is part of a literal string, and so has', & ' ! nothing to do with comments', & ' print *, ''Hello World! X='',x,''Y='',y', & '', & ' end program demo_comment', & '', & ' Results:', & '', & ' 2024-10-13T0:7:25.283 Hello World! X= 4.59107416E-41 Y= 2.76724564E-36', & '', & 'SEE ALSO', & ' CONTINUATION(5),', & '', & ' March 16, 2025 comment(5fortran)', & ''] shortname="comment" call process() case('68','compiler_options') textblock=[character(len=256) :: & '', & 'compiler_options(3fortran) compiler_options(3fortran)', & '', & 'NAME', & ' COMPILER_OPTIONS(3) - [COMPILER:INQUIRY] Options passed to the compiler', & '', & 'SYNOPSIS', & ' result = compiler_options()', & '', & ' character(len=:) function compiler_options()', & '', & 'CHARACTERISTICS', & ' o the return value is a default-kind character variable with system-', & ' dependent length.', & '', & 'DESCRIPTION', & ' COMPILER_OPTIONS(3) returns a string with the options used for compiling.', & '', & 'OPTIONS', & ' None.', & '', & 'RESULT', & ' The result contains the compiler flags used to compile the file containing', & ' the COMPILER_OPTIONS(3) call.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_compiler_version', & ' use, intrinsic :: iso_fortran_env, only : compiler_version', & ' use, intrinsic :: iso_fortran_env, only : compiler_options', & ' implicit none', & ' print ''(4a)'', &', & ' ''This file was compiled by '', &', & ' compiler_version(), &', & ' '' using the options '', &', & ' compiler_options()', & ' end program demo_compiler_version', & '', & ' Results:', & '', & ' > This file was compiled by GCC version 10.3.0 using', & ' > the options -I build/gfortran_2A42023B310FA28D', & ' > -mtune=generic -march=x86-64 -auxbase-strip', & ' > build/gfortran_2A42023B310FA28D/compiler_options/app_main.f90.o', & ' > -g -Wall -Wextra -Wimplicit-interface -fPIC -fmax-errors=1', & ' > -fcheck=bounds -fcheck=array-temps -fbacktrace', & ' > -fcoarray=single -J build/gfortran_2A42023B310FA28D', & ' > -fpre-include=/usr/include/finclude/math-vector-fortran.h', & '', & ' > This file was compiled by nvfortran 21.5-0 LLVM', & ' > using the options app/main.f90 -c -Minform=inform', & ' > -Mbackslash -Mbounds -Mchkptr -Mchkstk -traceback -module', & ' > build/nvfortran_78229DCE997517A4 -Ibuild/nvfortran_78229DCE997517A4 -o', & ' > build/nvfortran_78229DCE997517A4/compiler_options/app_main.f90.o', & '', & ' > This file was compiled by Intel(R) Fortran Intel(R) 64 Compiler Classic', & ' > for applications running on Intel(R) 64, Version 2021.3.0 Build', & ' > 20210609_000000 using the options -Ibuild/ifort_5C58216731706F11', & ' > -c -warn all -check all -error-limit 1 -O0 -g -assume', & ' > byterecl -traceback -module build/ifort_5C58216731706F11 -o', & ' > build/ifort_5C58216731706F11/compiler_options/app_main.f90.o', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' COMPILER_VERSION(3), ISO_FORTRAN_ENV(7)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 compiler_options(3fortran)', & ''] shortname="compiler_options" call process() case('69','compiler_version') textblock=[character(len=256) :: & '', & 'compiler_version(3fortran) compiler_version(3fortran)', & '', & 'NAME', & ' COMPILER_VERSION(3) - [COMPILER:INQUIRY] Compiler version string', & '', & 'SYNOPSIS', & ' result = compiler_version()', & '', & ' character(len=:) function compiler_version()', & '', & 'CHARACTERISTICS', & ' o The return value is a default-kind scalar character with system-dependent', & ' length.', & '', & 'DESCRIPTION', & ' COMPILER_VERSION(3) returns a string containing the name and version of the', & ' compiler.', & '', & 'OPTIONS', & ' None.', & '', & 'RESULT', & ' The return value contains the name of the compiler and its version number', & ' used to compile the file containing the COMPILER_VERSION(3) call.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_compiler_version', & ' use, intrinsic :: iso_fortran_env, only : compiler_version', & ' use, intrinsic :: iso_fortran_env, only : compiler_options', & ' implicit none', & ' print ''(4a)'', &', & ' ''This file was compiled by '', &', & ' compiler_version(), &', & ' '' using the options '', &', & ' compiler_options()', & ' end program demo_compiler_version', & '', & ' Results:', & '', & ' > This file was compiled by GCC version 10.3.0', & '', & ' > This file was compiled by Intel(R) Fortran Intel(R) 64 Compiler', & ' > Classic for applications running on Intel(R) 64, Version 2021.3.0 Build', & ' > 20210609_000000', & '', & ' > This file was compiled by nvfortran 21.5-0 LLVM', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' COMPILER_OPTIONS(3), ISO_FORTRAN_ENV(7)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 compiler_version(3fortran)', & ''] shortname="compiler_version" call process() case('70','conjg') textblock=[character(len=256) :: & '', & 'conjg(3fortran) conjg(3fortran)', & '', & 'NAME', & ' CONJG(3) - [NUMERIC] Complex conjugate of a complex value', & '', & 'SYNOPSIS', & ' result = conjg(z)', & '', & ' elemental complex(kind=KIND) function conjg(z)', & '', & ' complex(kind=**),intent(in) :: z', & '', & 'CHARACTERISTICS', & ' o Z is a complex value of any valid kind.', & '', & ' o The returned value has the same complex type as the input.', & '', & 'DESCRIPTION', & ' CONJG(3) returns the complex conjugate of the complex value Z.', & '', & ' That is, If Z is the complex value (X, Y) then the result is (X, -Y).', & '', & ' In mathematics, the complex conjugate of a complex number is a value whose', & ' real and imaginary part are equal parts are equal in magnitude to each other', & ' but the Y value has opposite sign.', & '', & ' For matrices of complex numbers, CONJG(ARRAY) represents the element-by-', & ' element conjugation of ARRAY; not the conjugate transpose of the ARRAY .', & '', & 'OPTIONS', & ' o Z : The value to create the conjugate of.', & '', & 'RESULT', & ' Returns a value equal to the input value except the sign of the imaginary', & ' component is the opposite of the input value.', & '', & ' That is, if Z has the value (X,Y), the result has the value (X, -Y).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_conjg', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' complex :: z = (2.0, 3.0)', & ' complex(kind=real64) :: dz = ( &', & ' & 1.2345678901234567_real64, -1.2345678901234567_real64)', & ' complex :: arr(3,3)', & ' integer :: i', & ' ! basics', & ' ! notice the sine of the imaginary component changes', & ' print *, z, conjg(z)', & '', & ' ! any complex kind is supported. z is of default kind but', & ' ! dz is kind=real64.', & ' print *, dz', & ' dz = conjg(dz)', & ' print *, dz', & ' print *', & '', & ' ! the function is elemental so it can take arrays', & ' arr(1,:)=[(-1.0, 2.0),( 3.0, 4.0),( 5.0,-6.0)]', & ' arr(2,:)=[( 7.0,-8.0),( 8.0, 9.0),( 9.0, 9.0)]', & ' arr(3,:)=[( 1.0, 9.0),( 2.0, 0.0),(-3.0,-7.0)]', & '', & ' write(*,*)''original''', & ' write(*,''(3("(",g8.2,",",g8.2,")",1x))'')(arr(i,:),i=1,3)', & ' arr = conjg(arr)', & ' write(*,*)''conjugate''', & ' write(*,''(3("(",g8.2,",",g8.2,")",1x))'')(arr(i,:),i=1,3)', & '', & ' end program demo_conjg', & '', & ' Results:', & '', & ' > (2.000000,3.000000) (2.000000,-3.000000)', & ' >', & ' > (1.23456789012346,-1.23456789012346)', & ' > (1.23456789012346,1.23456789012346)', & ' >', & ' > original', & ' > (-1.0 , 2.0 ) ( 3.0 , 4.0 ) ( 5.0 ,-6.0 )', & ' > ( 7.0 ,-8.0 ) ( 8.0 , 9.0 ) ( 9.0 , 9.0 )', & ' > ( 1.0 , 9.0 ) ( 2.0 , 0.0 ) (-3.0 ,-7.0 )', & ' >', & ' > conjugate', & ' > (-1.0 ,-2.0 ) ( 3.0 ,-4.0 ) ( 5.0 , 6.0 )', & ' > ( 7.0 , 8.0 ) ( 8.0 ,-9.0 ) ( 9.0 ,-9.0 )', & ' > ( 1.0 ,-9.0 ) ( 2.0 , 0.0 ) (-3.0 , 7.0 )', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o AIMAG(3) - Imaginary part of complex number', & '', & ' o CMPLX(3) - Complex conversion function', & '', & ' o REAL(3) - Convert to real type', & '', & ' Fortran has strong support for complex values, including many intrinsics', & ' that take or produce complex values in addition to algebraic and logical', & ' expressions:', & '', & ' ABS(3), ACOSH(3), ACOS(3), ASINH(3), ASIN(3), ATAN2(3), ATANH(3), ATAN(3),', & ' COSH(3), COS(3), CO_SUM(3), DBLE(3), DOT_PRODUCT(3), EXP(3), INT(3),', & ' IS_CONTIGUOUS(3), KIND(3), LOG(3), MATMUL(3), PRECISION(3), PRODUCT(3),', & ' RANGE(3), RANK(3), SINH(3), SIN(3), SQRT(3), STORAGE_SIZE(3), SUM(3),', & ' TANH(3), TAN(3), UNPACK(3),', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 conjg(3fortran)', & ''] shortname="conjg" call process() case('71','continuation') textblock=[character(len=256) :: & '', & 'continuation(5fortran) continuation(5fortran)', & '', & 'NAME', & ' CONTINUATION(5) - [FORTRAN] - the rules for free-format line continuation', & '', & 'SYNOPSIS', & ' general rule:', & '', & ' original long statement', & '', & ' becomes', & '', & ' original&', & ' & long&', & ' & statement', & '', & 'DESCRIPTION', & ' You may split almost all free-format Fortran statements into multiple lines', & ' by inserting the sequence "&\n&", where "\n" represents a newline. That is,', & ' split the line into two lines and place an ampersand at the right end of the', & ' first line and as the first (non-space) character in the second line.', & '', & ' You CANNOT split a comment or an INCLUDE pre-processor directive onto', & ' multiple lines using this syntax.', & '', & ' The rule for commenting continued lines is simple, really. Comments can go', & ' in the same places on continued lines as on non-continued lines accept they', & ' cannot appear after the right-hand "&" when continuing a long string.', & '', & ' So applying the general rule the line', & '', & ' integer,save :: xx(2,3)= reshape([ 1,2,3,4,5,6 ],shape(xx),order=[2,1])', & '', & ' may be split into many lines by simple repeated application of the rule:', & '', & ' integer,save :: xx(2,3)= reshape([&', & ' & 1, 2, 3, &', & ' & 4, 5, 6 &', & ' &],shape(xx),order=[2,1])', & '', & ' Of course, when used for continuation the "&" is not part of the equivalent', & ' concatenated statement.', & '', & ' That is basically it for the general rule, but there are a few variants and', & ' details to cover.', & '', & ' When a line is split using the general rule any trailing spaces before the', & ' amersand at the end of the line are included in the equivalent single-line', & ' statement.', & '', & ' However, spaces before the ampersand beginning the second line are ignored.', & ' So you can indent the lines beginning with an ampersand any way you like:', & '', & ' integer,save :: xx(2,3)= reshape([&', & ' & 1, 2, 3, &', & ' & 4, 5, 6 &', & ' &],shape(xx),order=[2,1])', & '', & ' Now it ends up the leading ampersand is actually optional if not splitting a', & ' lexical token or constant numeric or string value (which is generally not', & ' recommended anyway). If not present the result is the same as if an', & ' ampersand were inserted as the first character of the line -- so the leading', & ' spaces are significant when the leading ampersand is absent. When not', & ' splitting strings multiple spaces generally are treated the same as a single', & ' space so this is equivalent to the previous example:', & '', & ' integer,save :: xx(2,3)= reshape([ &', & ' 1, 2, 3, &', & ' 4, 5, 6 &', & ' ],shape(xx),order=[2,1])', & '', & 'COMMENTS ON COMMENTING CONTINUED LINES', & ' First, note you cannot continue a comment onto another line. An "&" in a', & ' comment is treated like any other character, with no special effect (Just', & ' start an additional comment line if you want a comment to appear across', & ' multiple lines).', & '', & ' That being said, comments themselves may occur as individual lines inbetween', & ' sections of a continued statement, or after the ending ampersand IF NOT', & ' CONTINUING A STRING CONSTANT.', & '', & ' So lets add an explanation about the continued line using in-line comments,', & ' comment lines and blank lines:', & '', & ' integer,save :: xx(2,3)= reshape([& ! define array in row-column order', & '', & ' !===========!', & ' & 1, 2, 3, & ! row 1', & ' & 4, 5, 6 & ! row 2', & ' !===========!', & '', & ' ],shape(xx),order=[2,1])', & '', & ' So trailing comments are allowed on non-character continuations, and comment', & ' lines and blank lines are always allowed.', & '', & ' Note no line shall contain a single "&" as the only nonblank character or as', & ' the only nonblank character before an ! that initiates a comment.', & '', & ' you have to have the leading amersand on continued lines when splitting', & ' quoted strings or lexical words or constant values.', & '', & ' But try to never split constants or lexical words!', & '', & ' character(len=*),parameter :: str1=''my first str'',str2=''my second str''', & '', & ' could be written as', & '', & ' char&', & ' &acter(len=*), para&', & ' &meter :: str1=''my fi&', & ' &rst str'', str2=''my se&', & ' &cond str''', & '', & ' where things were split in two in a haphazard way as long as no spaces are', & ' introduced before the ending amersand and after the leading amersand that', & ' would make the statement illegal if all appearing on one line (ignoring', & ' length for the moment).', & '', & ' This is a more realistic example (a very long string):', & '', & ' character(len=*),parameter=''this is a really long string &', & ' &that I needed to put onto several lines because it would be&', & ' & so long if I left it on a single line that it might be longer&', & ' & than allowed in older compilers and would certainly not fit &', & ' &in my favorite 80-column&', & ' & terminal window''', & '', & 'HOW LONG YOU CAN CONTINUE', & ' Since we are talking about very long lines, how long can a single statement', & ' be? In the Fortran 95 standard, only a maximum of 39 continuation lines is', & ' required to be conformant. In Fortran 2003 and Fortran 2008, at least 255 is', & ' to be allowed. There is no limit specified in Fortran 2018. See your', & ' compiler documentation to see if your compiler still has a limit, but it is', & ' probably at least a few hundred lines.', & '', & 'FIXED FORMAT AND INCLUDE FILES', & ' NOTE: Skip this session if you do not need to deal with (typically old)', & ' fixed-format Fortran files.', & '', & ' Fixed-format Fortran has a very different continuation rule where the first', & ' line has nothing added to it except an optional zero in column six and all', & ' continuations have a non-space non-zero character that is part of the', & ' Fortran character set in column six. If a quoted string is broken the first', & ' line acts as if padded with spaces out to column 72.', & '', & ' Even though the rules for continueing statements on multiple lines are so', & ' different, source code can be formatted in a format that works in both free', & ' and fixed-format files.', & '', & ' Other than being just a curiosity, this is useful if an INCLUDE file is', & ' needed by both free and fixed-format files. (Note that INCLUDE statements', & ' themselves are one of the few statements that cannot be split across', & ' multiple lines!).', & '', & ' So here is how to make an INCLUDE file for both fixed and free-format files:', & '', & ' o Conne statement labels to character positions 1 to 5 and statements to', & ' character positions 7 to 72, which is a requirement of fixed-format.', & '', & ' o Treat blanks as being significant, which they are in free-format.', & '', & ' o Use only the exclamation mark (!) to indicate a comment, but do not start', & ' the comment in character position 6.', & '', & ' o For continued statements, place an ampersand (&) in both character', & ' position 73 of a continued line and character position 6 of a', & ' continuation line.', & '', & ' Why does this work?', & '', & ' If every line being continued has an ampersand in column 73 or further the', & ' ampersand will be ignored by standard fixed-format Fortran.', & '', & ' Combined with the second ampersand always present and in column six for all', & ' but the first line both rules for free and fixed source files are satisfied.', & '', & ' Fixed-format can use most printable characters in column 6 to indication', & ' continuation. One of the allowed characters is "&", which is the one and', & ' only character used by free-format. So using it obeys both rules.', & '', & ' Therefore the following is equivalent in fixed and free-format parsing:', & '', & ' >12345 continue', & ' > character(len=*),parameter :: string1="hello world",string2="hel&', & ' > &lo world"', & '', & ' Obviously, this is not compatible with extended length fixed-format source', & ' files (which some compilers support as an extension) unless the ampersand is', & ' shifted beyond the extended limit (which in standard fixed-format files', & ' would be past column 72).', & '', & ' You may want to look for a compiler option to disable long-line warnings', & ' when using characters past column 72.', & '', & 'EXAMPLE', & ' Example program', & '', & ' program demo_continuation', & ' implicit none', & ' integer :: point(3)', & ' character(len=:),allocatable :: string', & '', & ' ! one statement using continuation:', & ' integer,save :: xx(3,5)= reshape([& ! define in row-column order', & ' !-------------------------!', & ' 1, 2, 3, 4, 5, & ! row 1', & ' 10, 20, 30, 40, 50, & ! row 2', & ' 11, 22, 33, 44, 55 & ! row 3', & ' !-------------------------!', & '', & ' ],shape(xx),order=[2,1])', & '', & ' ! print it in row-column order too', & ' call print_matrix_int(''xx array:'',xx)', & ' xx(3,5)= -1051', & ' call print_matrix_int(''xx array:'',xx)', & '', & ' ! So this is OK:', & ' POINT=[& ! define a Point <X,Y,Z>', & ' & 10, & ! the X component', & ' & 20, & ! the Y component', & ' & 30 ] ! the Z component', & '', & ' ! because you can have comments after the ampersand when it is not', & ' ! a string.', & ' ! But this is not OK:', & ' ! STRING=''& ! create a sentence', & ' ! & This& ! first word', & ' ! & is& ! second word', & ' ! & sentence& ! third word', & ' ! & a'' ! forth word (a comment here is OK)', & ' !Because when continuing a string you cannot have a comment after the "&".', & ' !', & ' ! This is OK:', & ' STRING=''&', & ' ! create a sentence', & ' & This&', & ' ! first word', & ' & is&', & ' ! second word', & ' & sentence&', & ' ! third word', & ' & a'' ! forth word (a comment here is OK)', & ' ! because comment LINES can go anywhere in Fortran source files', & '', & ' ! Dusty corners', & ' call splitting_a_token()', & ' call longstring()', & ' contains', & '', & ' subroutine splitting_a_token()', & '', & ' ! Often denoted by "e" in honor of Euler,', & ' ! Napier''s constant is the base of the natural logarithm system.', & ' real(kind=kind(0.0d0)),parameter :: &', & ' & Napier_constant = 2.71828182845904523d0', & '', & ' ! without continuation', & ' write(*,*)napier_constant', & '', & ' ! splitting a token the & is required', & ' write(*,*)napier_&', & ' &constant', & '', & ' ! the left-hand ampersand is required when splitting constants to,', & ' ! including characters strings', & ' write(*,*)''Expecting &', & ' &the value'',2.71828182&', & ' &845904523d0', & '', & ' !NOT ALLOWED <<<<<<', & ' !write(*,*)napier_&', & ' !constant', & ' !>>>>>>>', & '', & ' ! splitting a token is not recommended as it complicates identifying', & ' ! the use of a token name.', & '', & ' end subroutine splitting_a_token', & ' Subroutine LongString()', & ' ! Long strings:', & '', & ' Character (len=200) :: string1, String2', & ' character(len=:), allocatable :: a,b,c, big', & '', & ' string1 = "A very long string that won''t fit on a single &', & ' &line can be made through proper continuation."', & '', & ' ! alternatives to continuation lines', & ' string2 = "A very long string that won''t fit on a single " // &', & ' "line can be made through proper continuation " // &', & ' "and concatenation of multiple strings."', & ' print *, "string1=",string1', & ' print *, "string2=",string2', & '', & ' ! append multiple strings together to construct a long line', & ' a=repeat(''A'',100)', & ' b=repeat(''B'',100)', & ' big=a//b', & ' c=repeat(''C'',100)', & ' big=a//c', & ' big=big//"more at end"', & ' print *, "big=",big', & '', & ' End Subroutine LongString', & '', & ' subroutine print_matrix_int(title,arr)', & ' ! bonus points -- print an integer array in RC order with bells on.', & ' ! ie. It calculates the width needed for the longest variable and', & ' ! puts a frame around the array', & ' implicit none', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: arr(:,:)', & ' integer :: i', & ' integer :: size_needed', & ' character(len=:),allocatable :: biggest', & ' write(*,*)trim(title)', & ' biggest='' '' ! make buffer to write integer into', & ' ! find how many characters to use for integers', & ' size_needed=ceiling(log10(real(maxval(abs(arr)))))+2', & ' write(biggest,''(i0)'')size_needed', & ' ! use this format to write a row', & ' biggest=''(" |",*(i''//trim(biggest)//'':," |"))''', & ' ! print one row of array at a time', & ' write(*,''(*(g0))'')&', & ' &'' #'',(repeat(''-'',size_needed),''-#'',i=1,size(arr,dim=2))', & ' do i=1,size(arr,dim=1)', & ' write(*,fmt=biggest,advance=''no'')arr(i,:)', & ' write(*,''(" |")'')', & ' enddo', & ' write(*,''(*(g0))'')&', & ' &'' #'',(repeat(''-'',size_needed),''-#'',i=1,size(arr,dim=2))', & ' end subroutine print_matrix_int', & ' end program demo_continuation', & '', & ' Results:', & '', & ' xx array:', & ' #-----#-----#-----#-----#-----#', & ' | 1 | 2 | 3 | 4 | 5 |', & ' | 10 | 20 | 30 | 40 | 50 |', & ' | 11 | 22 | 33 | 44 | 55 |', & ' #-----#-----#-----#-----#-----#', & ' xx array:', & ' #-------#-------#-------#-------#-------#', & ' | 1 | 2 | 3 | 4 | 5 |', & ' | 10 | 20 | 30 | 40 | 50 |', & ' | 11 | 22 | 33 | 44 | -1051 |', & ' #-------#-------#-------#-------#-------#', & ' 2.7182818284590451', & ' 2.7182818284590451', & ' Expecting the value 2.7182818284590451', & ' string1=A very long string that won''t fit on a single \...', & ' line can be made through proper continuation.', & ' string2=A very long string that won''t fit on a single \...', & ' line can be made through proper continuation and \...', & ' concatenation of multiple strings.', & ' big=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\...', & ' AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCC\...', & ' CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\...', & ' CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmore at end', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 continuation(5fortran)', & ''] shortname="continuation" call process() case('72','continue') textblock=[character(len=256) :: & '', & 'continue(7fortran) continue(7fortran)', & '', & 'NAME', & ' CONTINUE(7) - [EXECUTION_CONTROL] execution of a CONTINUE statement has no', & ' effect', & '', & 'SYNOPSIS', & ' [NNNNN] continue', & '', & 'DESCRIPTION', & ' It is generally very confusing to have executable statements on labeled', & ' lines; a CONTINUE statement eliminates the ambiguities that arise in jumping', & ' to an executable line. Specifically:', & '', & ' o Execution of a CONTINUE statement has no effect.', & '', & ' o Preferably no target of a transfer should be an executable statement.', & '', & ' o Therefore, all numerically labeled executable lines should be a CONTINUE.', & '', & ' A CONTINUE statement is most often used as a target for transfer control', & ' statements such as GOTO. That is, a numeric label is added to the line.', & '', & ' CONTINUE(7f) is rarely used in new code but was very commonly encountered in', & ' older FORTRAN code before the advent of constructs like ENDDO, CYCLE, BLOCK,', & ' and EXIT.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' > program oldstyle', & ' > integer i,j', & ' > j=5', & ' > do 100 i=1,20', & ' > if(i.lt.5)goto 100', & ' > j=3', & ' >100 write(*,*)''J='',j', & ' > end', & '', & ' program demo_continue', & ' ! numbered targets should (almost?) always be a continue statement', & ' ! with a unique label for each looping structure', & ' integer :: i,j', & ' j=5', & ' do 100 i=1,20', & ' if(i.lt.5)goto 50', & ' j=3', & ' 50 continue', & ' write(*,*)''J='',j', & ' 100 continue', & ' end program demo_continue', & '', & ' program newer', & ' implicit none', & ' integer :: i,j', & ' j=5', & ' do i=1,20', & ' if(i >= 5)then', & ' j=3', & ' endif', & ' write(*,*)''J='',j', & ' enddo', & ' end program newer', & '', & ' Fortran statement descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 continue(7fortran)', & ''] shortname="continue" call process() case('73','co_reduce') textblock=[character(len=256) :: & '', & 'co_reduce(3fortran) co_reduce(3fortran)', & '', & 'NAME', & ' CO_REDUCE(3) - [COLLECTIVE] Reduction of values on the current set of images', & '', & 'SYNOPSIS', & ' call co_reduce(a, operation, result_image [,stat] [,errmsg] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' CO_REDUCE(3) determines element-wise the reduction of the value of A on all', & ' images of the current team. The pure function passed as OPERATION is used to', & ' pairwise reduce the values of A by passing either the value of A of', & ' different images or the result values of such a reduction as argument. If A', & ' is an array, the reduction is done element wise. If result_image is present,', & ' the result values are returned in A on the specified image only and the', & ' value of A on the other images become undefined. If result_image is not', & ' present, the value is returned on all images. If the execution was', & ' successful and STAT is present, it is assigned the value zero. If the', & ' execution failed, STAT gets assigned a nonzero value and, if present, ERRMSG', & ' gets assigned a value describing the occurred error.', & '', & 'OPTIONS', & ' o A : is an INTENT(INOUT) argument and shall be nonpolymorphic. If it is', & ' allocatable, it shall be allocated; if it is a pointer, it shall be', & ' associated. A shall have the same type and type parameters on all images', & ' of the team; if it is an array, it shall have the same shape on all', & ' images.', & '', & ' o OPERATION : pure function with two scalar nonallocatable arguments, which', & ' shall be nonpolymorphic and have the same type and type parameters as A.', & ' The function shall return a nonallocatable scalar of the same type and', & ' type parameters as A. The function shall be the same on all images and', & ' with regards to the arguments mathematically commutative and associative.', & ' Note that OPERATION may not be an elemental unless it is an intrinsic', & ' function.', & '', & ' o RESULT_IMAGE', & '', & ' : (optional) a scalar integer expression; if present, it shall have', & ' the same the same value on all images and refer to an image of the', & ' current team.', & '', & ' o STAT : (optional) a scalar integer variable', & '', & ' o ERRMSG : (optional) a scalar character variable', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_co_reduce', & ' implicit none', & ' integer :: val', & '', & ' val = this_image()', & ' call co_reduce(val, myprod, 1)', & ' if (this_image() == 1) then', & ' write(*,*) "Product value", val ! prints num_images() factorial', & ' endif', & '', & ' contains', & '', & ' pure function myprod(a, b)', & ' integer, value :: a, b', & ' integer :: myprod', & ' myprod = a * b', & ' end function myprod', & '', & ' end program demo_co_reduce', & '', & ' Results:', & '', & ' > Product value 1', & '', & 'NOTE', & ' While the rules permit in principle an intrinsic function, none of the', & ' intrinsics in the standard fulfill the criteria of having a specific', & ' function, which takes two arguments of the same type and returning that type', & ' as a result.', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' CO_MIN(3), CO_MAX(3), CO_SUM(3), CO_BROADCAST(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 co_reduce(3fortran)', & ''] shortname="co_reduce" call process() case('74','cos') textblock=[character(len=256) :: & '', & 'cos(3fortran) cos(3fortran)', & '', & 'NAME', & ' COS(3) - [MATHEMATICS:TRIGONOMETRIC] Cosine function', & '', & 'SYNOPSIS', & ' result = cos(x)', & '', & ' elemental TYPE(kind=KIND) function cos(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is of type real or complex of any valid kind.', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' COS(3) computes the cosine of an angle X given the size of the angle in', & ' radians.', & '', & ' The cosine of a real value is the ratio of the adjacent side to the', & ' hypotenuse of a right-angled triangle.', & '', & 'OPTIONS', & ' o X : The angle in radians when X is of type real. If X is of type complex,', & ' its real part is regarded as a value in radians, often called the phase.', & '', & 'RESULT', & ' The return value is the cosine of X.', & '', & ' If X is type real, the return value lies in the range -1 <= COS(X) <= 1 .', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_cos', & ' implicit none', & ' real,parameter :: PI=atan(1.0d0)*4.0d0', & ' real :: val', & ' character,parameter :: nl=NEW_LINE(''A'')', & ' write(*,''(*(g0))'',advance=''no'') &', & '', & ' ''basics:'', nl, &', & ' '' COS(0.0) = '', cos(0.0), nl, &', & ' '' COS(PI) = '', cos(PI), nl, &', & ' '' '', nl, &', & ' ''X may be any real value'', nl, &', & ' '' COS(222*PI) = '', cos(222*PI), nl, &', & ' '' COS(-333*PI) = '', cos(-333*PI), nl, &', & ' '' '', nl, &', & ' ''note: probably not exactly zero ....'', nl, &', & ' '' COS(PI/2.0)= '', cos(PI/2.0), nl, &', & ' '' EPSILON= '', epsilon(PI), nl, &', & ' '' '', nl, &', & ' ''COS() is elemental'', nl, &', & ' '' COS([0.0,PI/4,PI/2,PI*3/4,PI]) = '', nl', & ' write(*,''(*(1x,g0,1x))'') COS([0.0,PI/4,PI/2,PI*3/4,PI])', & '', & ' write(*,''(*(g0))'',advance=''no'') &', & ' '' '', nl, &', & ' ''Law of Cosines:'', nl, &', & ' '' '', nl, &', & ' ''right triangle'', nl, &', & ' two_sides_and_degrees_between(3.0,4.0,90.0), nl, &', & ' ''equilateral'', nl, &', & ' two_sides_and_degrees_between(3.3,3.3,60.0), nl, &', & ' '' '', nl, &', & ' ''Dusty Corners:'', nl, &', & ' '' '', nl, &', & ' ''If very large, representable numbers are far apart'', nl, &', & ' ''so adding or subtracting a few radians can not even'', nl, &', & ' ''change the value! Note the expected values here:'', nl', & ' val=0.0', & ' call delta( val-2.0, val-1.0 )', & '', & ' write(*,''(a)'') ''but look at the same call when the values are huge;''', & ' val=huge(0.0)/1000', & ' call delta( val-2.0, val-1.0 )', & '', & ' contains', & '', & ' subroutine delta(A,B)', & ' real(kind=kind(0.0)),intent(in) :: a,b', & ' print ''(a,t30,g0)'' , &', & ' '' A= '', A, &', & ' '' B= '', B, &', & ' '' B-A= '', B-A, &', & ' '' COS(A*PI)= '', cos(A*PI), &', & ' '' COS(B*PI)= '', cos(B*PI), &', & ' '' spacing(A)= '', spacing(A), &', & ' '' COS((B-A)*PI)= '', cos((B-A)*PI), &', & ' '' COS(B*PI)-COS(A*PI)= '', cos(B*PI)-cos(A*PI), &', & ' repeat(''='',40)', & ' end subroutine delta', & '', & ' function two_sides_and_degrees_between(a,b,X) result(str)', & ' real,intent(in) :: a,b,X', & ' real :: c', & ' real,parameter :: PI = atan(1.0d0) * 4.0d0', & ' real,parameter :: degrees_to_radians = PI / 180.0', & ' character,parameter :: nl=NEW_LINE(''A'')', & ' character(len=:),allocatable :: str', & ' ! The law of cosines states that for a', & ' ! triangle with sides of length a, b, and c', & ' ! that if the angle X is formed by sides a and', & ' ! b that the length of the third side c is', & ' !', & ' c = sqrt( a**2 + b**2 - 2*a*b*cos(degrees_to_radians*X) )', & ' allocate( character(len=132) :: str )', & ' write(str,''(*(g0))'')&', & ' ''For sides A='',a,'', B='',b,'' and X='',x,'' degrees,'',nl,''side C='',c', & ' str=trim(str)', & ' !', & ' ! \', & ' ! / \', & ' ! / Y \', & ' ! / \', & ' ! / \', & ' ! / \', & ' ! b / \ c', & ' ! / \', & ' ! / \', & ' ! / \', & ' ! / \', & ' ! / X Z \', & ' ! -------------------------', & ' ! a', & ' end function two_sides_and_degrees_between', & ' end program demo_cos', & '', & ' Results:', & '', & ' > basics:', & ' > COS(0.0) = 1.00000000', & ' > COS(PI) = -1.00000000', & ' >', & ' > X may be any real value', & ' > COS(222*PI) = 1.00000000', & ' > COS(-333*PI) = -1.00000000', & ' >', & ' > note: probably not exactly zero ....', & ' > COS(PI/2.0)= -0.437113883E-7', & ' > EPSILON= 0.119209290E-6', & ' >', & ' > COS() is elemental', & ' > COS([0.0,PI/4,PI/2,PI*3/4,PI]) =', & ' > 1.00000000 0.707106769 -0.437113883E-7 -0.707106769 -1.00000000', & ' >', & ' > Law of Cosines:', & ' >', & ' > right triangle', & ' > For sides A=3.00000000, B=4.00000000 and X=90.0000000 degrees,', & ' > side C=5.00000000', & ' > equilateral', & ' > For sides A=3.29999995, B=3.29999995 and X=60.0000000 degrees,', & ' > side C=3.29999995', & ' >', & ' > Dusty Corners:', & ' >', & ' > If very large, representable numbers are far apart', & ' > so adding or subtracting a few radians can not even', & ' > change the value! Note the expected values here:', & ' > A= -2.00000000', & ' > B= -1.00000000', & ' > B-A= 1.00000000', & ' > COS(A*PI)= 1.00000000', & ' > COS(B*PI)= -1.00000000', & ' > spacing(A)= 0.238418579E-6', & ' > COS((B-A)*PI)= -1.00000000', & ' > COS(B*PI)-COS(A*PI)= -2.00000000', & ' > ========================================', & ' > but look at the same call when the values are huge;', & ' > A= 0.340282343E+36', & ' > B= 0.340282343E+36', & ' > B-A= 0.00000000', & ' > COS(A*PI)= 0.766595423', & ' > COS(B*PI)= 0.766595423', & ' > spacing(A)= 0.396140813E+29', & ' > COS((B-A)*PI)= 1.00000000', & ' > COS(B*PI)-COS(A*PI)= 0.00000000', & ' > ========================================', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' ACOS(3), SIN(3), TAN(3)', & '', & 'RESOURCES', & ' o Wikipedia:sine and cosine', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 cos(3fortran)', & ''] shortname="cos" call process() case('75','cosd') textblock=[character(len=256) :: & '', & 'cosd(3fortran) cosd(3fortran)', & '', & 'NAME', & ' COSD(3) - [MATHEMATICS:TRIGONOMETRIC] Degree cosine function', & '', & 'SYNOPSIS', & ' result = cosd(x)', & '', & ' elemental real(kind=KIND) function cosd(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is of type real of any valid kind.', & '', & ' o KIND may be any real kind.', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' COSD(3) computes the cosine of an angle X given the size of the angle in', & ' degrees.', & '', & ' The cosine is the ratio of the adjacent side to the hypotenuse of a right-', & ' angled triangle.', & '', & 'OPTIONS', & ' o X : The angle in degrees to compute the cosine of.', & '', & 'RESULT', & ' The return value is an approximation of the cosine of X.', & '', & ' The return value lies in the range', & '', & ' -1 \<= cosd(x) \<= 1', & '', & 'EXAMPLES', & ' cosd(180.0) has the value -1.0 (approximately).', & '', & ' Sample program:', & '', & ' program demo_cosd', & ' implicit none', & ' character(len=*),parameter :: g2=''(a,t20,g0)''', & ' write(*,g2)''cosd(0.0)='',cosd(0.0)', & ' write(*,g2)''cosd(180.0)='',cosd(180.0)', & ' write(*,g2)''cosd(90.0d0)='',cosd(90.0d0)', & ' write(*,g2)''cosd(360.0)='',cosd(360.0)', & ' write(*,g2)''cosd(-360.0)='',cosd(-360.0)', & ' write(*,g2)''cosd(-2000*180.0)='',cosd(-2000*180.0)', & ' write(*,g2)''cosd(3000*180.0)='',cosd(3000*180.0)', & ' end program demo_cosd', & '', & ' Results:', & '', & ' > cosd(0.0)= 1.00000000', & ' > cosd(180.0)= -1.00000000', & ' > cosd(90.0d0)= 0.0000000000000000', & ' > cosd(360.0)= 1.00000000', & ' > cosd(-360.0)= 1.00000000', & ' > cosd(-2000*180.0)= 1.00000000', & ' > cosd(3000*180.0)= 1.00000000', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' ACOSD(3), ACOS(3), SIND(3), TAND(3)', & '', & 'RESOURCES', & ' o Wikipedia:sine and cosine', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 cosd(3fortran)', & ''] shortname="cosd" call process() case('76','cosh') textblock=[character(len=256) :: & '', & 'cosh(3fortran) cosh(3fortran)', & '', & 'NAME', & ' COSH(3) - [MATHEMATICS:TRIGONOMETRIC] Hyperbolic cosine function', & '', & 'SYNOPSIS', & ' result = cosh(x)', & '', & ' elemental TYPE(kind=KIND) function cosh(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o TYPE may be real or complex of any kind.', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' COSH(3) computes the hyperbolic cosine of X.', & '', & ' If X is of type complex its imaginary part is regarded as a value in', & ' radians.', & '', & 'OPTIONS', & ' o X : the value to compute the hyperbolic cosine of', & '', & 'RESULT', & ' If X is complex, the imaginary part of the result is in radians.', & '', & ' If X is real, the return value has a lower bound of one, COSH(X) >= 1.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_cosh', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 1.0_real64', & ' write(*,*)''X='',x,''COSH(X=)'',cosh(x)', & ' end program demo_cosh', & '', & ' Results:', & '', & ' > X= 1.00000000000000 COSH(X=) 1.54308063481524', & '', & 'STANDARD', & ' FORTRAN 77 , for a complex argument - Fortran 2008', & '', & 'SEE ALSO', & ' Inverse function: ACOSH(3)', & '', & 'RESOURCES', & ' o Wikipedia:hyperbolic functions', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 cosh(3fortran)', & ''] shortname="cosh" call process() case('77','cospi') textblock=[character(len=256) :: & '', & 'cospi(3fortran) cospi(3fortran)', & '', & 'NAME', & ' COSPI(3) - [MATHEMATICS:TRIGONOMETRIC] Circular Cosine function', & '', & 'SYNOPSIS', & ' result = cospi(x)', & '', & ' elemental real(kind=KIND) function cospi(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is of type real.', & '', & ' o KIND may be any kind supported by the associated type of X.', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' COSPI(3) computes the circular cosine of an angle X given the size of the', & ' angle in half-revolutions.', & '', & ' The cosine of a real value is the ratio of the adjacent side to the', & ' hypotenuse of a right-angled triangle.', & '', & ' COSPI(X) is approximately equal to COS(X*PI).', & '', & 'OPTIONS', & ' o X : The angle in half-revolutions to compute the cosine of.', & '', & 'RESULT', & ' The return value is the approximate value of the cosine of X.', & '', & ' The return value lies in the range -1 <= COSPI(X) <= 1 .', & '', & 'EXAMPLES', & ' Example: COSPI(1.0) has the value -1.0 (approximately).', & '', & ' Sample program:', & '', & ' program demo_cos', & ' implicit none', & ' character(len=*),parameter :: g2=''(a,t21,*(g0,1x))''', & ' write(*,g2) ''Basics:''', & ' write(*,g2) ''COSpi(0)='', cospi(0.0d0)', & ' write(*,g2) ''COSpi(1)='', cospi(1.0d0)', & ' write(*,g2) ''COSpi(1/2)='', cospi(1.0d0/2.0d0)', & ' write(*,g2) ''COSpi(2)='', cospi(2.0d0)', & ' write(*,g2) ''COSpi(-2)='', cospi(-2.0d0)', & ' write(*,g2) ''COSpi(-2000)='', cospi(-2000.0d0)', & ' write(*,g2) ''COSpi(3000)='', cospi(3000.0d0)', & ' write(*,g2) ''Elemental:''', & ' write(*,g2) ''COSpi([0,1/4,-1/4])='',COSpi([0.0,0.25,-0.25])', & ' end program demo_cos', & '', & ' Results:', & '', & ' > Basics:', & ' > COSpi(0)= 1.0000000000000000', & ' > COSpi(1)= -1.0000000000000000', & ' > COSpi(1/2)= 0.61232339957367660E-16', & ' > COSpi(2)= 1.0000000000000000', & ' > COSpi(-2)= 1.0000000000000000', & ' > COSpi(-2000)= 1.0000000000000000', & ' > COSpi(3000)= 1.0000000000000000', & ' > Elemental:', & ' > COSpi([0,1/4,-1/4])=1.00000000 0.707106769 0.707106769', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' ACOS(3), SIN(3), TAN(3)', & '', & 'RESOURCES', & ' o Wikipedia:sine and cosine', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 cospi(3fortran)', & ''] shortname="cospi" call process() case('78','co_sum') textblock=[character(len=256) :: & '', & 'co_sum(3fortran) co_sum(3fortran)', & '', & 'NAME', & ' CO_SUM(3) - [COLLECTIVE] Sum of values on the current set of images', & '', & 'SYNOPSIS', & ' call co_sum(a, result_image [,stat] [,errmsg] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' CO_SUM(3) sums up the values of each element of A on all images of the', & ' current team.', & '', & ' If result_image is present, the summed-up values are returned in A on the', & ' specified image only and the value of A on the other images become', & ' undefined.', & '', & ' If result_image is not present, the value is returned on all images. If the', & ' execution was successful and STAT is present, it is assigned the value zero.', & ' If the execution failed, STAT gets assigned a nonzero value and, if present,', & ' ERRMSG gets assigned a value describing the occurred error.', & '', & 'OPTIONS', & ' o A : shall be an integer, real or complex variable, which has the same', & ' type and type parameters on all images of the team.', & '', & ' o RESULT_IMAGE : (optional) a scalar integer expression; if present, it', & ' shall have the same the same value on all images and refer to an image of', & ' the current team.', & '', & ' o STAT : (optional) a scalar integer variable', & '', & ' o ERRMSG : (optional) a scalar character variable', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_co_sum', & ' implicit none', & ' integer :: val', & ' val = this_image()', & ' call co_sum(val, result_image=1)', & ' if (this_image() == 1) then', & ' ! prints (n**2 + n)/2, with n = num_images()', & ' write(*,*) "The sum is ", val', & ' endif', & ' end program demo_co_sum', & '', & ' Results:', & '', & ' > The sum is 1', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' CO_MAX(3), CO_MIN(3), CO_REDUCE(3), CO_BROADCAST(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 co_sum(3fortran)', & ''] shortname="co_sum" call process() case('79','co_ubound') textblock=[character(len=256) :: & '', & 'co_ubound(3fortran) co_ubound(3fortran)', & '', & 'NAME', & ' CO_UBOUND(3) - [COLLECTIVE] Upper codimension bounds of an array', & '', & 'SYNOPSIS', & ' result = co_ubound(coarray [,dim] [,kind] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' CO_UBOUND(3) returns the upper cobounds of a coarray, or a single upper', & ' cobound along the DIM codimension.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an coarray, of any type.', & '', & ' o DIM : (Optional) Shall be a scalar integer.', & '', & ' o KIND : (Optional) An integer initialization expression indicating the', & ' kind parameter of the result.', & '', & 'RESULT', & ' The return value is of type integer and of kind KIND. If KIND is absent, the', & ' return value is of default integer kind. If DIM is absent, the result is an', & ' array of the lower cobounds of COARRAY. If DIM is present, the result is a', & ' scalar corresponding to the lower cobound of the array along that', & ' codimension.', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' CO_LBOUND(3), LBOUND(3), UBOUND(3)', & '', & ' fortran-lang intrinsic descriptions', & '', & ' February 18, 2023 co_ubound(3fortran)', & ''] shortname="co_ubound" call process() case('80','count') textblock=[character(len=256) :: & '', & 'count(3fortran) count(3fortran)', & '', & 'NAME', & ' COUNT(3) - [ARRAY:REDUCTION] Count true values in an array', & '', & 'SYNOPSIS', & ' result = count(mask [,dim] [,kind] )', & '', & ' integer(kind=KIND) function count(mask, dim, KIND )', & '', & ' logical(kind=**),intent(in) :: mask(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o MASK is a logical array of any shape and kind.', & '', & ' o If DIM is present, the result is an array with the specified rank', & ' removed.', & '', & ' o KIND is a scalar integer constant expression valid as an integer kind', & '', & ' o The return value is of default integer type unless KIND is specified to', & ' declare the kind of the result.', & '', & 'DESCRIPTION', & ' COUNT(3) counts the number of .true. elements in a logical MASK, or, if the', & ' DIM argument is supplied, counts the number of elements along each row of', & ' the array in the DIM direction. If the array has zero size or all of the', & ' elements of MASK are false, then the result is 0.', & '', & 'OPTIONS', & ' o MASK : an array to count the number of .true. values in', & '', & ' o DIM : specifies to remove this dimension from the result and produce an', & ' array of counts of .true. values along the removed dimension. If not', & ' present, the result is a scalar count of the true elements in MASK the', & ' value must be in the range 1 <= dim <= n, where n is the rank(number of', & ' dimensions) of MASK.', & '', & ' The corresponding actual argument shall not be an optional dummy', & ' argument, a disassociated pointer, or an unallocated allocatable.', & '', & ' o KIND : An integer initialization expression indicating the kind parameter', & ' of the result.', & '', & 'RESULT', & ' The return value is the number of .true. values in MASK if DIM is not', & ' present.', & '', & ' If DIM is present, the result is an array with a rank one less than the rank', & ' of the input array MASK, and a size corresponding to the shape of ARRAY with', & ' the DIM dimension removed, with the remaining elements containing the number', & ' of .true. elements along the removed dimension.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_count', & ' implicit none', & ' character(len=*),parameter :: ints=''(*(i2,1x))''', & ' ! two arrays and a mask all with the same shape', & ' integer, dimension(2,3) :: a, b', & ' logical, dimension(2,3) :: mymask', & ' integer :: i', & ' integer :: c(2,3,4)', & '', & ' print *,''the numeric arrays we will compare''', & ' a = reshape( [ 1, 2, 3, 4, 5, 6 ], [ 2, 3 ])', & ' b = reshape( [ 0, 7, 3, 4, 5, 8 ], [ 2, 3 ])', & ' c = reshape( [( i,i=1,24)], [ 2, 3 ,4])', & ' print ''(3i3)'', a(1,:)', & ' print ''(3i3)'', a(2,:)', & ' print *', & ' print ''(3i3)'', b(1,:)', & ' print ''(3i3)'', b(2,:)', & ' !', & ' ! basic calls', & ' print *, ''count a few basic things creating a mask from an expression''', & ' print *, ''count a>b'',count(a>b)', & ' print *, ''count b<a'',count(a<b)', & ' print *, ''count b==a'',count(a==b)', & ' print *, ''check sum = '',count(a>b) + &', & ' & count(a<b) + &', & ' & count(a==b).eq.size(a)', & ' !', & ' ! The common usage is just getting a count, but if you want', & ' ! to specify the DIM argument and get back reduced arrays', & ' ! of counts this is easier to visualize if we look at a mask.', & ' print *, ''make a mask identifying unequal elements ...''', & ' mymask = a.ne.b', & ' print *, ''the mask generated from a.ne.b''', & ' print ''(3l3)'', mymask(1,:)', & ' print ''(3l3)'', mymask(2,:)', & ' !', & ' print *,''count total and along rows and columns ...''', & ' !', & ' print ''(a)'', ''number of elements not equal''', & ' print ''(a)'', ''(ie. total true elements in the mask)''', & ' print ''(3i3)'', count(mymask)', & ' !', & ' print ''(a)'', ''count of elements not equal in each column''', & ' print ''(a)'', ''(ie. total true elements in each column)''', & ' print ''(3i3)'', count(mymask, dim=1)', & ' !', & ' print ''(a)'', ''count of elements not equal in each row''', & ' print ''(a)'', ''(ie. total true elements in each row)''', & ' print ''(3i3)'', count(mymask, dim=2)', & ' !', & ' ! working with rank=3 ...', & ' print *, ''lets try this with c(2,3,4)''', & ' print *,'' taking the result of the modulo ''', & ' print *,'' z=1 z=2 z=3 z=4 ''', & ' print *,'' 1 3 0 || 2 4 1 || 3 0 2 || 4 1 3 |''', & ' print *,'' 2 4 1 || 3 0 2 || 4 1 3 || 0 2 4 |''', & ' print *,'' ''', & ' print *,'' would result in the mask .. ''', & ' print *,'' F F T || F F F || F T F || F F F |''', & ' print *,'' F F F || F T F || F F F || T F F |''', & ' print *,'' ''', & ' print *,'' the total number of .true.values is''', & ' print ints, count(modulo(c,5).eq.0)', & ' call printi(''counting up along a row and removing rows'',&', & ' count(modulo(c,5).eq.0,dim=1))', & ' call printi(''counting up along a column and removing columns'',&', & ' count(modulo(c,5).eq.0,dim=2))', & ' call printi(''counting up along a depth and removing depths'',&', & ' count(modulo(c,5).eq.0,dim=3))', & ' !', & ' contains', & ' !', & ' ! CONVENIENCE ROUTINE FOR PRINTING SMALL INTEGER MATRICES', & ' subroutine printi(title,arr)', & ' implicit none', & ' !', & ' !@(#) print small 2d integer arrays in row-column format', & ' !', & ' character(len=*),parameter :: all=''(*(g0,1x))'' ! a handy format', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: arr(:,:)', & ' integer :: i', & ' character(len=:),allocatable :: biggest', & ' !', & ' print all', & ' print all, trim(title),'':('',shape(arr),'')'' ! print title', & ' biggest='' '' ! make buffer to write integer into', & ' ! find how many characters to use for integers', & ' write(biggest,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(arr))))))+2', & ' ! use this format to write a row', & ' biggest=''(" > [",*(i''//trim(biggest)//'':,","))''', & ' ! print one row of array at a time', & ' do i=1,size(arr,dim=1)', & ' write(*,fmt=biggest,advance=''no'')arr(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & ' !', & ' end subroutine printi', & ' end program demo_count', & '', & ' Results:', & '', & ' > the numeric arrays we will compare', & ' > 1 3 5', & ' > 2 4 6', & ' >', & ' > 0 3 5', & ' > 7 4 8', & ' > count a few basic things creating a mask from an expression', & ' > count a>b 1', & ' > count b<a 2', & ' > count b==a 3', & ' > check sum = T', & ' > make a mask identifying unequal elements ...', & ' > the mask generated from a.ne.b', & ' > T F F', & ' > T F T', & ' > count total and along rows and columns ...', & ' > number of elements not equal', & ' > (ie. total true elements in the mask)', & ' > 3', & ' > count of elements not equal in each column', & ' > (ie. total true elements in each column)', & ' > 2 0 1', & ' > count of elements not equal in each row', & ' > (ie. total true elements in each row)', & ' > 1 2', & ' > lets try this with c(2,3,4)', & ' > taking the result of the modulo', & ' > z=1 z=2 z=3 z=4', & ' > 1 3 0 || 2 4 1 || 3 0 2 || 4 1 3 |', & ' > 2 4 1 || 3 0 2 || 4 1 3 || 0 2 4 |', & ' >', & ' > would result in the mask ..', & ' > F F T || F F F || F T F || F F F |', & ' > F F F || F T F || F F F || T F F |', & ' >', & ' > the total number of .true.values is', & ' > 4', & ' >', & ' > counting up along a row and removing rows :( 3 4 )', & ' > > [ 0, 0, 0, 1 ]', & ' > > [ 0, 1, 1, 0 ]', & ' > > [ 1, 0, 0, 0 ]', & ' >', & ' > counting up along a column and removing columns :( 2 4 )', & ' > > [ 1, 0, 1, 0 ]', & ' > > [ 0, 1, 0, 1 ]', & ' >', & ' > counting up along a depth and removing depths :( 2 3 )', & ' > > [ 0, 1, 1 ]', & ' > > [ 1, 1, 0 ]', & '', & 'STANDARD', & ' Fortran 95 , with KIND argument - Fortran 2003', & '', & 'SEE ALSO', & ' o ANY(3)', & '', & ' o ALL(3)', & '', & ' o SUM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 count(3fortran)', & ''] shortname="count" call process() case('81','cpu_time') textblock=[character(len=256) :: & '', & 'cpu_time(3fortran) cpu_time(3fortran)', & '', & 'NAME', & ' CPU_TIME(3) - [SYSTEM:TIME] Return CPU processor time used in seconds', & '', & 'SYNOPSIS', & ' call cpu_time(time)', & '', & ' subroutine cpu_time(time)', & '', & ' real,intent(out) :: time', & '', & 'CHARACTERISTICS', & ' o TIME is a real of any kind', & '', & 'DESCRIPTION', & ' CPU_TIME(3) returns a real value representing the elapsed CPU time in', & ' seconds. This is useful for testing segments of code to determine execution', & ' time.', & '', & ' If no time source is available, TIME is set to a negative value.', & '', & ' The exact definition of time is left imprecise because of the variability in', & ' what different processors are able to provide.', & '', & ' Note that TIME may contain a system dependent, arbitrary offset and may not', & ' start with 0.0. For CPU_TIME(3) the absolute value is meaningless. Only', & ' differences between subsequent calls, as shown in the example below, should', & ' be used.', & '', & 'PARALLEL PROCESSING', & ' Whether the value assigned is an approximation to the amount of time used by', & ' the invoking image, or the amount of time used by the whole program, is', & ' processor dependent.', & '', & ' A processor for which a single result is inadequate (for example, a parallel', & ' processor) might choose to provide an additional version for which TIME is', & ' an array.', & '', & 'RESULT', & ' o TIME : is assigned a processor-dependent approximation to the processor', & ' time in seconds. If the processor cannot return a meaningful time, a', & ' processor-dependent negative value is returned.', & '', & ' : The start time is left imprecise because the purpose is to time', & ' sections of code, as in the example. This might or might not include', & ' system overhead time.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_cpu_time', & ' use, intrinsic :: iso_fortran_env, only : real32,real64,real128', & ' implicit none', & ' real :: start, finish', & ' real(kind=real64) :: startd, finishd', & ' !', & ' call cpu_time(start)', & ' call cpu_time(startd)', & ' ! put code to time here', & ' call cpu_time(finish)', & ' call cpu_time(finishd)', & ' !', & ' ! writes processor time taken by the piece of code.', & '', & ' ! the accuracy of the clock and whether it includes system time', & ' ! as well as user time is processor dependent. Accuracy up to', & ' ! milliseconds is common but not guaranteed, and may be much', & ' ! higher or lower', & ' print ''("Processor Time = ",f6.3," seconds.")'',finish-start', & '', & ' ! see your specific compiler documentation for how to measure', & ' ! parallel jobs and for the precision of the time returned', & ' print ''("Processor Time = ",g0," seconds.")'',finish-start', & ' print ''("Processor Time = ",g0," seconds.")'',finishd-startd', & ' end program demo_cpu_time', & '', & ' Results:', & '', & ' The precision of the result, some aspects of what is returned, and what if', & ' any options there are for parallel applications may very from system to', & ' system. See compiler-specific for details.', & '', & ' > Processor Time = 0.000 seconds.', & ' > Processor Time = .4000030E-05 seconds.', & ' > Processor Time = .2000000000000265E-05 seconds.', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' SYSTEM_CLOCK(3), DATE_AND_TIME(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 cpu_time(3fortran)', & ''] shortname="cpu_time" call process() case('82','cshift') textblock=[character(len=256) :: & '', & 'cshift(3fortran) cshift(3fortran)', & '', & 'NAME', & ' CSHIFT(3) - [ARRAY:TRANSFORMATIONAL] Circular shift elements of an array', & '', & 'SYNOPSIS', & ' result = cshift(array, shift [,dim])', & '', & ' type(TYPE(kind=KIND)) function cshift(array, shift, dim )', & '', & ' type(TYPE(kind=KIND)),intent(in) :: array(..)', & ' integer(kind=**),intent(in) :: shift', & ' integer(kind=**),intent(in) :: dim', & '', & 'CHARACTERISTICS', & ' o ARRAY may be any type and rank', & '', & ' o SHIFT an integer scalar if ARRAY has rank one. Otherwise, it shall be', & ' scalar or of rank n-1 and of shape [d1, d2, ..., dDIM-1, dDIM+1,', & '', & ' o DIM is an integer scalar with a value in the range 1 <= DIM <= n, where n', & ' is the rank of ARRAY. If DIM is absent, it is as if it were present with', & ' the value 1.', & '', & ' o the result will automatically be of the same type, kind and shape as', & ' ARRAY.', & '', & ' NOTE: :a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' CSHIFT(3) performs a circular shift on elements of ARRAY along the dimension', & ' of DIM. If DIM is omitted it is taken to be 1. DIM is a scalar of type', & ' integer in the range of 1 <= DIM <= N, where "n" is the rank of ARRAY.', & '', & ' If the rank of ARRAY is one, then all elements of ARRAY are shifted by SHIFT', & ' places. If rank is greater than one, then all complete rank one sections of', & ' ARRAY along the given dimension are shifted. Elements shifted out one end of', & ' each rank one section are shifted back in the other end.', & '', & 'OPTIONS', & ' o ARRAY : An array of any type which is to be shifted', & '', & ' o SHIFT : the number of positions to circularly shift. A negative value', & ' produces a right shift, a positive value produces a left shift.', & '', & ' o DIM : the dimension along which to shift a multi-rank ARRAY. Defaults to', & ' 1.', & '', & 'RESULT', & ' Returns an array of same type and rank as the ARRAY argument.', & '', & ' The rows of an array of rank two may all be shifted by the same amount or by', & ' different amounts.', & '', & ' cshift', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_cshift', & ' implicit none', & ' integer, dimension(5) :: i1', & ' integer, dimension(3,4) :: a, b', & ' !basics', & ' i1=[10,20,30,40,50]', & ' print *,''start with:''', & ' print ''(1x,5i3)'', i1', & ' print *,''shift -2''', & ' print ''(1x,5i3)'', cshift(i1,-2)', & ' print *,''shift +2''', & ' print ''(1x,5i3)'', cshift(i1,+2)', & '', & ' print *,''start with a matrix''', & ' a = reshape( [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ], [ 3, 4 ])', & ' print ''(4i3)'', a(1,:)', & ' print ''(4i3)'', a(2,:)', & ' print ''(4i3)'', a(3,:)', & ' print *,''matrix shifted along rows, each by its own amount [-1,0,1]''', & ' b = cshift(a, SHIFT=[1, 0, -1], DIM=2)', & ' print *', & ' print ''(4i3)'', b(1,:)', & ' print ''(4i3)'', b(2,:)', & ' print ''(4i3)'', b(3,:)', & ' end program demo_cshift', & '', & ' Results:', & '', & ' > start with:', & ' > 10 20 30 40 50', & ' > shift -2', & ' > 40 50 10 20 30', & ' > shift +2', & ' > 30 40 50 10 20', & ' > start with a matrix', & ' > 1 4 7 10', & ' > 2 5 8 11', & ' > 3 6 9 12', & ' > matrix shifted along rows, each by its own amount', & ' >', & ' > 4 7 10 1', & ' > 2 5 8 11', & ' > 12 3 6 9', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o EOSHIFT(3) - End-off shift elements of an array', & '', & ' o SUM(3) - sum the elements of an array', & '', & ' o PRODUCT(3) - Product of array elements', & '', & ' o FINDLOC(3) - Location of first element of ARRAY identified by MASK along', & ' dimension DIM having a value', & '', & ' o MAXLOC(3) - Location of the maximum value within an array', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 cshift(3fortran)', & ''] shortname="cshift" call process() case('83','c_sizeof') textblock=[character(len=256) :: & '', & 'c_sizeof(3fortran) c_sizeof(3fortran)', & '', & 'NAME', & ' C_SIZEOF(3) - [ISO_C_BINDING] Size in bytes of an expression', & '', & 'SYNOPSIS', & ' result = c_sizeof(x)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' C_SIZEOF(3) calculates the number of bytes of storage the expression X', & ' occupies.', & '', & 'OPTIONS', & ' o X : The argument shall be an interoperable data entity.', & '', & 'RESULT', & ' The return value is of type integer and of the system-dependent kind csize_t', & ' (from the iso_c_binding module). Its value is the number of bytes occupied', & ' by the argument. If the argument has the pointer attribute, the number of', & ' bytes of the storage area pointed to is returned. If the argument is of a', & ' derived type with pointer or allocatable components, the return value does', & ' not account for the sizes of the data pointed to by these components.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_c_sizeof', & ' use iso_c_binding', & ' implicit none', & ' real(c_float) :: r, s(5)', & ' print *, (c_sizeof(s)/c_sizeof(r) == 5)', & ' end program demo_c_sizeof', & '', & ' Results:', & '', & ' > T', & '', & ' The example will print .true. unless you are using a platform where default', & ' real variables are unusually padded.', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' STORAGE_SIZE(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 c_sizeof(3fortran)', & ''] shortname="c_sizeof" call process() case('84','date_and_time') textblock=[character(len=256) :: & '', & 'date_and_time(3fortran) date_and_time(3fortran)', & '', & 'NAME', & ' DATE_AND_TIME(3) - [SYSTEM:TIME] Gets current date and time', & '', & 'SYNOPSIS', & ' subroutine date_and_time(date, time, zone, values)', & '', & ' character(len=8),intent(out),optional :: date', & ' character(len=10),intent(out),optional :: time', & ' character(len=5),intent(out),optional :: zone', & ' integer,intent(out),optional :: values(8)', & '', & 'CHARACTERISTICS', & ' o DATE, TIME, and ZONE are default character scalar types', & '', & ' o VALUES is a rank-one array of type integer with a decimal exponent range', & ' of at least four.', & '', & 'DESCRIPTION', & ' DATE_AND_TIME(3) gets the corresponding date and time information from the', & ' real-time system clock.', & '', & ' Unavailable time and date character parameters return blanks.', & '', & ' Unavailable numeric parameters return -HUGE(VALUE).', & '', & 'OPTIONS', & ' o DATE : A character string of default kind of the form CCYYMMDD, of length', & ' 8 or larger, where', & '', & ' o CCYY is the year in the Gregorian calendar', & '', & ' o MM is the month within the year', & '', & ' o DD is the day within the month.', & '', & ' The characters of this value are all decimal digits.', & '', & ' If there is no date available, DATE is assigned all blanks.', & '', & ' o TIME : A character string of default kind of the form HHMMSS.SSS, of', & ' length 10 or larger, where', & '', & ' o HH is the hour of the day,', & '', & ' o MM is the minutes of the hour,', & '', & ' o and SS.SSS is the seconds and milliseconds of the minute.', & '', & ' Except for the decimal point, the characters of this value shall all be', & ' decimal digits.', & '', & ' If there is no clock available, TIME is assigned all blanks.', & '', & ' o ZONE : A string of the form (+-)HHMM, of length 5 or larger, representing', & ' the difference with respect to Coordinated Universal Time (UTC), where', & '', & ' o HH and MM are the time difference with respect to Coordinated', & ' Universal Time (UTC) in hours and minutes, respectively.', & '', & ' The characters of this value following the sign character are all decimal', & ' digits.', & '', & ' If this information is not available, ZONE is assigned all blanks.', & '', & ' o VALUES : An array of at least eight elements. If there is no data', & ' available for a value it is set to -HUGE(VALUES). Otherwise, it contains:', & '', & ' o VALUES(1) : The year, including the century.', & '', & ' o VALUES(2) : The month of the year', & '', & ' o VALUES(3) : The day of the month', & '', & ' o VALUES(4) : Time difference in minutes between the reported time and', & ' UTC time.', & '', & ' o VALUES(5) : The hour of the day, in the range 0 to 23.', & '', & ' o VALUES(6) : The minutes of the hour, in the range 0 to 59', & '', & ' o VALUES(7) : The seconds of the minute, in the range 0 to 60', & '', & ' o VALUES(8) : The milliseconds of the second, in the range 0 to 999.', & '', & ' The date, clock, and time zone information might be available on some images', & ' and not others. If the date, clock, or time zone information is available on', & ' more than one image, it is processor dependent whether or not those images', & ' share the same information.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_date_and_time', & ' implicit none', & ' character(len=8) :: date', & ' character(len=10) :: time', & ' character(len=5) :: zone', & ' integer, dimension(8) :: values', & '', & ' call date_and_time(date, time, zone, values)', & '', & ' ! using keyword arguments', & ' call date_and_time(DATE=date, TIME=time, ZONE=zone)', & ' print ''(*(g0))'',''DATE="'',date,''" TIME="'',time,''" ZONE="'',zone,''"''', & '', & ' call date_and_time(VALUES=values)', & ' write (*, ''(i5,a)'') &', & ' & values(1), '' - The year'', &', & ' & values(2), '' - The month'', &', & ' & values(3), '' - The day of the month'', &', & ' & values(4), '' - Time difference with UTC in minutes'', &', & ' & values(5), '' - The hour of the day'', &', & ' & values(6), '' - The minutes of the hour'', &', & ' & values(7), '' - The seconds of the minute'', &', & ' & values(8), '' - The milliseconds of the second''', & '', & ' write (*, ''(a)'') iso_8601()', & ' contains', & ' function iso_8601()', & ' ! return date using ISO-8601 format at a resolution of seconds', & ' character(len=8) :: dt', & ' character(len=10) :: tm', & ' character(len=5) :: zone', & ' character(len=25) :: iso_8601', & ' call date_and_time(dt, tm, zone)', & ' ISO_8601 = dt(1:4)//''-''//dt(5:6)//''-''//dt(7:8) &', & ' & //''T''// &', & ' & tm(1:2)//'':''//tm(3:4)//'':''//tm(5:6) &', & ' & //zone(1:3)//'':''//zone(4:5)', & ' end function iso_8601', & ' end program demo_date_and_time', & '', & ' Results:', & '', & ' > DATE="20240426" TIME="111545.335" ZONE="-0400"', & ' > 2024 - The year', & ' > 4 - The month', & ' > 26 - The day of the month', & ' > -240 - Time difference with UTC in minutes', & ' > 11 - The hour of the day', & ' > 15 - The minutes of the hour', & ' > 45 - The seconds of the minute', & ' > 335 - The milliseconds of the second', & ' > 2024-04-26T11:15:45-04:00', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' These forms are compatible with the representations defined in ISO', & ' 8601:2004.', & '', & ' UTC is established by the International Bureau of Weights and Measures', & ' (BIPM, i.e. Bureau International des Poids et Mesures) and the International', & ' Earth Rotation Service (IERS).', & '', & ' CPU_TIME(3), SYSTEM_CLOCK(3)', & '', & 'RESOURCES', & ' date and time conversion, formatting and computation', & '', & ' o M_time - https://github.com/urbanjost/M_time', & '', & ' o fortran-datetime - https://github.com/dongli/fortran-datetime', & '', & ' o datetime-fortran - https://github.com/wavebitscientific/datetime-fortran', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 date_and_time(3fortran)', & ''] shortname="date_and_time" call process() case('85','dble') textblock=[character(len=256) :: & '', & 'dble(3fortran) dble(3fortran)', & '', & 'NAME', & ' DBLE(3) - [TYPE:CONVERSION] Converstion to double precision real', & '', & 'SYNOPSIS', & ' result = dble(a)', & '', & ' elemental doubleprecision function dble(a)', & '', & ' doubleprecision :: dble', & ' TYPE(kind=KIND),intent(in) :: a', & '', & 'CHARACTERISTICS', & ' o A my be integer, real, complex, or a BOZ-literal-constant', & '', & ' o the result is a doubleprecision real.', & '', & 'DESCRIPTION', & ' DBLE(3) Converts A to double precision real type.', & '', & 'OPTIONS', & ' o A : a value to convert to a doubleprecision real.', & '', & 'RESULT', & ' The return value is of type doubleprecision. For complex input, the returned', & ' value has the magnitude and sign of the real component of the input value.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_dble', & ' implicit none', & ' real:: x = 2.18', & ' integer :: i = 5', & ' complex :: z = (2.3,1.14)', & ' print *, dble(x), dble(i), dble(z)', & ' end program demo_dble', & '', & ' Results:', & '', & ' > 2.1800000667572021 5.0000000000000000 2.2999999523162842', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o AIMAG(3) - Imaginary part of complex number', & '', & ' o CMPLX(3) - Convert values to a complex type', & '', & ' o INT(3) - Truncate towards zero and convert to integer', & '', & ' o NINT(3) - Nearest whole number', & '', & ' o OUT_OF_RANGE(3) - Whether a value cannot be converted safely.', & '', & ' o REAL(3) - Convert to real type', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 dble(3fortran)', & ''] shortname="dble" call process() case('86','deallocate') textblock=[character(len=256) :: & '', & 'deallocate(7fortran) deallocate(7fortran)', & '', & 'NAME', & ' DEALLOCATE(7f) - [FORTRAN:STATEMENT] causes allocated variables and targets', & ' to be deallocated', & '', & 'SYNOPSIS', & ' DEALLOCATE(allocate-object-list [,STAT=stat][,ERRMSG=errmsg] )', & '', & 'DESCRIPTION', & ' The DEALLOCATE statement causes allocatable variables to be deallocated; it', & ' causes pointer targets to be deallocated and the pointers to be', & ' disassociated.', & '', & ' An allocate-object shall not depend on the value, bounds, allocation status,', & ' or association status of another allocate-object in the same DEALLOCATE', & ' statement; it also shall not depend on the value of the stat-variable or', & ' errmsg-variable in the same DEALLOCATE statement.', & '', & ' The status of objects that were not successfully allocated or deallocated', & ' can be individually checked with the intrinsic functions ALLOCATED or', & ' ASSOCIATED.', & '', & 'OPTIONS', & ' ALLOCATED-OBJECT-LIST : Each allocate-object is a nonprocedure pointer or an', & ' allocatable variable.', & '', & ' STAT=STAT-VARIABLE : If the STAT= specifier appears, successful execution of', & ' the ALLOCATE or DEALLOCATE statement causes the stat-variable to become', & ' defined with a value of zero.', & '', & ' If an error condition occurs during execution of a DEALLOCATE statement that', & ' does not contain the STAT= specifier, error termination is initiated.', & '', & ' ERRMSG=ERRMSG-VARIABLE : If an error condition occurs during execution of an', & ' ALLOCATE or DEALLOCATE statement, the processor assigns an explanatory', & ' message to errmsg-variable. If no such condition occurs, the processor does', & ' not change the value of the errmsg-variable.', & '', & ' No dealloc-opt shall appear more than once in a given DEALLOCATE statement.', & '', & ' The errmsg-variable and stat-variable cannot be allocated or deallocated', & ' elsewhere in the statement or otherwise depend of any allocatable object in', & ' the statement.', & '', & 'EXAMPLE', & ' An example of a DEALLOCATE statement is:', & '', & ' DEALLOCATE (X, B)', & '', & 'DEALLOCATION OF ALLOCATABLE VARIABLES', & ' Deallocating an unallocated allocatable variable causes an error condition', & ' in the DEALLOCATE statement. Deallocating an allocatable variable with the', & ' TARGET attribute causes the pointer association status of any pointer', & ' associated with it to become undefined.', & '', & ' When the execution of a procedure is terminated by execution of a RETURN or', & ' END statement, an unsaved allocatable local variable of the procedure', & ' retains its allocation and definition status if it is a function result', & ' variable or a subobject thereof; otherwise, it is deallocated.', & '', & ' When a BLOCK construct terminates, an unsaved allocatable local variable of', & ' the construct is deallocated.', & '', & ' If an executable construct references a function whose result is either', & ' allocatable or a structure with a subobject that is allocatable, and the', & ' function reference is executed, an allocatable result and any subobject that', & ' is an allocated allocatable entity in the result returned by the function is', & ' deallocated after execution of the innermost executable construct containing', & ' the reference.', & '', & ' If a function whose result is either allocatable or a structure with an', & ' allocatable subobject is referenced in the specification part of a scoping', & ' unit or BLOCK construct, and the function reference is executed, an', & ' allocatable result and any subobject that is an allocated allocatable entity', & ' in the result returned by the function is deallocated before execution of', & ' the executable constructs of the scoping unit or block.', & '', & ' When a procedure is invoked, any allocated allocatable object that is an', & ' actual argument corresponding to an INTENT (OUT) allocatable dummy argument', & ' is deallocated; any allocated allocatable object that is a subobject of an', & ' actual argument corresponding to an INTENT (OUT) dummy argument is', & ' deallocated.', & '', & ' When an intrinsic assignment statement (7.2.1.3) is executed, any noncoarray', & ' allocated allocatable subobject of the variable is deallocated before the', & ' assignment takes place.', & '', & ' When a variable of derived type is deallocated, any allocated allocatable', & ' subobject is deallocated.', & '', & ' If an allocatable component is a subobject of a finalizable object, that', & ' object is finalized before the component is automatically deallocated.', & '', & ' The effect of automatic deallocation is the same as that of a DEALLOCATE', & ' statement without a dealloc-opt-list.', & '', & ' There is implicit synchronization of all images in association with each', & ' DEALLOCATE statement that deallocates one or more coarrays. On each image,', & ' execution of the segment (8.5.1) following the statement is delayed until', & ' all other images have executed the same statement the same number of times.', & ' If the coarray is a dummy argument, its ultimate argument (12.5.2.3) shall', & ' be the same coarray on every image.', & '', & ' There is also an implicit synchronization of all images in association with', & ' the deallocation of a coarray or coarray subcomponent caused by the', & ' execution of a RETURN or END statement or the termination of a BLOCK', & ' construct.', & '', & ' In the following example:', & '', & ' > SUBROUTINE PROCESS', & ' > REAL, ALLOCATABLE :: TEMP(:)', & ' >', & ' > REAL, ALLOCATABLE, SAVE :: X(:)', & ' > ...', & ' > END SUBROUTINE PROCESS', & '', & ' on return from subroutine PROCESS, the allocation status of X is preserved', & ' because X has the SAVE attribute. TEMP does not have the SAVE attribute, so', & ' it will be deallocated if it was allocated. On the next invocation of', & ' PROCESS, TEMP will have an allocation status of unallocated.', & '', & 'DEALLOCATION OF POINTER TARGETS', & ' If a pointer appears in a DEALLOCATE statement, its association status shall', & ' be defined. Deallocating a pointer that is disassociated or whose target was', & ' not created by an ALLOCATE statement causes an error condition in the', & ' DEALLOCATE statement. If a pointer is associated with an allocatable entity,', & ' the pointer shall not be deallocated.', & '', & ' If a pointer appears in a DEALLOCATE statement, it shall be associated with', & ' the whole of an object that was created by allocation. Deallocating a', & ' pointer target causes the pointer association status of any other pointer', & ' that is associated with the target or a portion of the target to become', & ' undefined.', & '', & ' If an ALLOCATE or DEALLOCATE statement with a coarray allocate-object is', & ' executed when one or more images has initiated termination of execution, the', & ' stat-variable becomes defined with the processor-dependent positive integer', & ' value of the constant STAT STOPPED IMAGE from the intrinsic module', & ' ISO_FORTRAN_ENV (13.8.2). If any other error condition occurs during', & ' execution of the ALLOCATE or DEALLOCATE statement, the stat-variable becomes', & ' defined with a processor-dependent positive integer value different from', & ' STAT STOPPED IMAGE. In either case, each allocate-object has a processor-', & ' dependent status:', & '', & ' o each allocate-object that was successfully allocated shall have an', & ' allocation status of allocated or a pointer association status of', & ' associated;', & '', & ' o each allocate-object that was successfully deallocated shall have an', & ' allocation status of unallocated or a pointer association status of', & ' disassociated;', & '', & ' o each allocate-object that was not successfully allocated or deallocated', & ' shall retain its previous allocation status or pointer association', & ' status.', & '', & ' March 16, 2025 deallocate(7fortran)', & ''] shortname="deallocate" call process() case('87','digits') textblock=[character(len=256) :: & '', & 'digits(3fortran) digits(3fortran)', & '', & 'NAME', & ' DIGITS(3) - [MODEL:NUMERIC] Significant digits in the numeric model', & '', & 'SYNOPSIS', & ' result = digits(x)', & '', & ' integer function digits(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x(..)', & '', & 'CHARACTERISTICS', & ' o X an integer or real scalar or array', & '', & ' o The return value is an integer of default kind.', & '', & 'DESCRIPTION', & ' DIGITS(3) returns the number of significant digits of the internal model', & ' representation of X. For example, on a system using a 32-bit floating point', & ' representation, a default real number would likely return 24.', & '', & 'OPTIONS', & ' o X : a value of the type and kind to query', & '', & 'RESULT', & ' The number of significant digits in a variable of the type and kind of X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_digits', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0:,1x))''', & ' integer :: i = 12345', & ' real :: x = 3.143', & ' doubleprecision :: y = 2.33d0', & ' print all, ''default integer: '', digits(i)', & ' print all, ''default real: '', digits(x)', & ' print all, ''default doubleprecision:'', digits(y)', & ' end program demo_digits', & '', & ' Results:', & '', & ' > default integer: 31', & ' > default real: 24', & ' > default doubleprecision: 53', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3),', & ' SCALE(3), SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 digits(3fortran)', & ''] shortname="digits" call process() case('88','dim') textblock=[character(len=256) :: & '', & 'dim(3fortran) dim(3fortran)', & '', & 'NAME', & ' DIM(3) - [NUMERIC] Positive difference of X - Y', & '', & 'SYNOPSIS', & ' result = dim(x, y)', & '', & ' elemental TYPE(kind=KIND) function dim(x, y )', & '', & ' TYPE(kind=KIND),intent(in) :: x, y', & '', & 'CHARACTERISTICS', & ' o X and Y may be any real or integer but of the same type and kind', & '', & ' o the result is of the same type and kind as the arguments', & '', & 'DESCRIPTION', & ' DIM(3) returns the maximum of X - Y and zero. That is, it returns the', & ' difference X - Y if the result is positive; otherwise it returns zero. It', & ' is equivalent to', & '', & ' max(0,x-y)', & '', & 'OPTIONS', & ' o X : the subtrahend, ie. the number being subtracted from.', & '', & ' o Y : the minuend; ie. the number being subtracted', & '', & 'RESULT', & ' Returns the difference X - Y or zero, whichever is larger.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_dim', & ' use, intrinsic :: iso_fortran_env, only : real64', & ' implicit none', & ' integer :: i', & ' real(kind=real64) :: x', & '', & ' ! basic usage', & ' i = dim(4, 15)', & ' x = dim(4.321_real64, 1.111_real64)', & ' print *, i', & ' print *, x', & '', & ' ! elemental', & ' print *, dim([1,2,3],2)', & ' print *, dim([1,2,3],[3,2,1])', & ' print *, dim(-10,[0,-10,-20])', & '', & ' end program demo_dim', & '', & ' Results:', & '', & ' > 0', & ' > 3.21000000000000', & ' > 0 0 1', & ' > 0 0 2', & ' > 0 0 10', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o ABS(3) - Absolute value', & '', & ' o AINT(3) - Truncate toward zero to a whole number', & '', & ' o ANINT(3) - Real nearest whole number', & '', & ' o CEILING(3) - Integer ceiling function', & '', & ' o CONJG(3) - Complex conjugate of a complex value', & '', & ' o DIM(3) - Positive difference of X - Y', & '', & ' o DPROD(3) - Double precision real product', & '', & ' o FLOOR(3) - Function to return largest integral value', & '', & ' o MAX(3) - Maximum value of an argument list', & '', & ' o MIN(3) - Minimum value of an argument list', & '', & ' o MOD(3) - Remainder function', & '', & ' o SIGN(3) - Sign copying function', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 dim(3fortran)', & ''] shortname="dim" call process() case('89','dot_product') textblock=[character(len=256) :: & '', & 'dot_product(3fortran) dot_product(3fortran)', & '', & 'NAME', & ' DOT_PRODUCT(3) - [ARRAY:TRANSFORMATIONAL] Dot product of two vectors', & '', & 'SYNOPSIS', & ' result = dot_product(vector_a, vector_b)', & '', & ' TYPE(kind=KIND) function dot_product(vector_a, vector_b)', & '', & ' TYPE(kind=KIND),intent(in) :: vector_a(:)', & ' TYPE(kind=KIND),intent(in) :: vector_b(:)', & '', & 'CHARACTERISTICS', & ' o VECTOR_A, VECTOR_B may be any numeric or logical type array of rank one', & ' of the same size', & '', & ' o the two vectors need not be of the same kind, but both must be logical or', & ' numeric for any given call.', & '', & ' o the result is the same type and kind of the vector that is the higher', & ' type that the other vector is optionally promoted to if they differ.', & '', & ' The two vectors may be either numeric or logical and must be arrays of rank', & ' one and of equal size.', & '', & 'DESCRIPTION', & ' DOT_PRODUCT(3) computes the dot product multiplication of two vectors', & ' VECTOR_A and VECTOR_B.', & '', & 'OPTIONS', & ' o VECTOR_A : A rank 1 vector of values', & '', & ' o VECTOR_B : The type shall be numeric if VECTOR_A is of numeric type or', & ' logical if vector_a is of type logical. vector_b shall be a rank-one', & ' array of the same size as VECTOR_A.', & '', & 'RESULT', & ' If the arguments are numeric, the return value is a scalar of numeric type.', & ' If the arguments are logical, the return value is .true. or .false..', & '', & ' If the vectors are integer or real, the result is', & '', & ' sum(vector_a*vector_b)', & '', & ' If the vectors are complex, the result is', & '', & ' sum(conjg(vector_a)*vector_b)', & '', & ' If the vectors have size zero, the result has the value zero.', & '', & ' If the vectors are logical, the result is', & '', & ' any(vector_a .and. vector_b)', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_dot_prod', & ' implicit none', & ' integer, dimension(3) :: a, b', & ' a = [ 1, 2, 3 ]', & ' b = [ 4, 5, 6 ]', & ' print ''(3i3)'', a', & ' print *', & ' print ''(3i3)'', b', & ' print *', & ' print *, dot_product(a,b)', & ' end program demo_dot_prod', & '', & ' Results:', & '', & ' > 1 2 3', & ' >', & ' > 4 5 6', & ' >', & ' > 32', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' SUM(3), CONJG(3), ANY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 dot_product(3fortran)', & ''] shortname="dot_product" call process() case('90','dprod') textblock=[character(len=256) :: & '', & 'dprod(3fortran) dprod(3fortran)', & '', & 'NAME', & ' DPROD(3) - [NUMERIC] Double precision real product', & '', & 'SYNOPSIS', & ' result = dprod(x,y)', & '', & ' elemental function dprod(x,y)', & '', & ' real,intent(in) :: x', & ' real,intent(in) :: y', & ' doubleprecision :: dprod', & '', & 'CHARACTERISTICS', & ' o X is a default real.', & '', & ' o Y is a default real.', & '', & ' o the result is a doubleprecision real.', & '', & ' The setting of compiler options specifying the size of a default real can', & ' affect this function.', & '', & 'DESCRIPTION', & ' DPROD(3) produces a doubleprecision product of default real values X and Y.', & '', & ' That is, it is expected to convert the arguments to double precision before', & ' multiplying, which a simple expression X*Y would not be required to do. This', & ' can be significant in specialized computations requiring high precision.', & '', & ' The result has a value equal to a processor-dependent approximation to the', & ' product of X and Y. Note it is recommended in the standard that the', & ' processor compute the product in double precision, rather than in single', & ' precision then converted to double precision; but is only a recommendation.', & '', & 'OPTIONS', & ' o X : the multiplier', & '', & ' o Y : the multiplicand', & '', & 'RESULT', & ' The returned value of the product should have the same value as', & ' DBLE(X)*DBLE(Y).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_dprod', & ' implicit none', & ' integer,parameter :: dp=kind(0.0d0)', & ' real :: x = 5.2', & ' real :: y = 2.3', & ' doubleprecision :: xx', & ' real(kind=dp) :: dd', & '', & ' print *,''algebraically 5.2 x 2.3 is exactly 11.96''', & ' print *,''as floating point values results may differ slightly:''', & ' ! basic usage', & ' dd = dprod(x,y)', & ' print *, ''compare dprod(xy)='',dd, &', & ' & ''to x*y='',x*y, &', & ' & ''to dble(x)*dble(y)='',dble(x)*dble(y)', & '', & ' print *,''test if an expected result is produced''', & ' xx=-6.0d0', & ' write(*,*)DPROD(-3.0, 2.0),xx', & ' write(*,*)merge(''PASSED'',''FAILED'',DPROD(-3.0, 2.0) == xx)', & '', & ' print *,''elemental''', & ' print *, dprod( [2.3,3.4,4.5], 10.0 )', & ' print *, dprod( [2.3,3.4,4.5], [9.8,7.6,5.4] )', & '', & ' end program demo_dprod', & '', & ' Results: (this can vary between programming environments):', & '', & ' > algebraically 5.2 x 2.3 is exactly 11.96', & ' > as floating point values results may differ slightly:', & ' > compare dprod(xy)= 11.9599993133545 to x*y= 11.96000', & ' > to dble(x)*dble(y)= 11.9599993133545', & ' > test if an expected result is produced', & ' > -6.00000000000000 -6.00000000000000', & ' > PASSED', & ' > elemental', & ' > 22.9999995231628 34.0000009536743 45.0000000000000', & ' > 22.5399999713898 25.8400004005432 24.3000004291534', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' DBLE(3) REAL(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 dprod(3fortran)', & ''] shortname="dprod" call process() case('91','dshiftl') textblock=[character(len=256) :: & '', & 'dshiftl(3fortran) dshiftl(3fortran)', & '', & 'NAME', & ' DSHIFTL(3) - [BIT:COPY] Combined left shift of the bits of two integers', & '', & 'SYNOPSIS', & ' result = dshiftl(i, j, shift)', & '', & ' elemental integer(kind=KIND) function dshiftl(i, j, shift)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=KIND),intent(in) :: j', & ' integer(kind=**),intent(in) :: shift', & '', & 'CHARACTERISTICS', & ' o the kind of I, J, and the return value are the same. An exception is that', & ' one of I and J may be a BOZ literal constant (A BOZ literal constant is a', & ' binary, octal or hex constant).', & '', & ' o If either I or J is a BOZ-literal-constant (but not both), it is first', & ' converted as if by the intrinsic function INT(3) to type integer with the', & ' kind type parameter of the other.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' DSHIFTL(3) combines bits of I and J. The rightmost SHIFT bits of the result', & ' are the leftmost SHIFT bits of J, and the remaining bits are the rightmost', & ' BITSIZE(I)-SHIFT of I.', & '', & ' Hence DSHIFTL is designated as a "combined left shift", because it is like', & ' we appended I and J together, shifted it SHIFT bits to the left, and then', & ' kept the same number of bits as I or J had.', & '', & ' For example, for two 16-bit values if SHIFT=6', & '', & ' SHIFT=6', & ' I = 1111111111111111', & ' J = 0000000000000000', & ' COMBINED 11111111111111110000000000000000', & ' DROP LEFT BITS 11111111110000000000000000', & ' KEEP LEFT 16 1111111111000000', & '', & 'NOTE', & ' This is equivalent to', & '', & ' ior( shiftl(i, shift), shiftr(j, bit_size(j) - shift) )', & '', & ' Also note that using this last representation of the operation is can be', & ' derived that when both I and J have the same value as in', & '', & ' dshiftl(i, i, shift)', & '', & ' the result has the same value as a circular shift:', & '', & ' ishftc(i, shift)', & '', & 'OPTIONS', & ' o I : used to define the left pattern of bits in the combined pattern', & '', & ' o J : used for the right pattern of bits in the combined pattern', & '', & ' o SHIFT : shall be nonnegative and less than or equal to the number of bits', & ' in an integer input value (ie. the bit size of either one that is not a', & ' BOZ literal constant).', & '', & 'RESULT', & ' The leftmost SHIFT bits of J are copied to the rightmost bits of the result,', & ' and the remaining bits are the rightmost bits of I.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_dshiftl', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int32) :: i, j', & ' integer :: shift', & '', & ' ! basic usage', & ' write(*,*) dshiftl (1, 2**30, 2) ! int32 values on little-endian => 5', & '', & ' ! print some simple calls as binary to better visual the results', & ' i=-1', & ' j=0', & ' shift=5', & ' call printit()', & '', & ' ! the leftmost SHIFT bits of J are copied to the rightmost result bits', & ' j=int(b"11111000000000000000000000000000")', & ' ! and the other bits are the rightmost bits of I', & ' i=int(b"00000000000000000000000000000000")', & ' call printit()', & '', & ' j=int(b"11111000000000000000000000000000")', & ' i=int(b"00000111111111111111111111111111")', & ' ! result should be all 1s', & ' call printit()', & '', & ' contains', & ' subroutine printit()', & ' ! print i,j,shift and then i,j, and the result as binary values', & ' write(*,''(*(g0))'')''I='',i,'' J='',j,'' SHIFT='',shift', & ' write(*,''(b32.32)'') i,j, dshiftl (i, j, shift)', & ' end subroutine printit', & '', & ' end program demo_dshiftl', & '', & ' Results:', & '', & ' > 5', & ' > I=-1 J=0 SHIFT=5', & ' > 11111111111111111111111111111111', & ' > 00000000000000000000000000000000', & ' > 11111111111111111111111111100000', & ' > I=0 J=-134217728 SHIFT=5', & ' > 00000000000000000000000000000000', & ' > 11111000000000000000000000000000', & ' > 00000000000000000000000000011111', & ' > I=134217727 J=-134217728 SHIFT=5', & ' > 00000111111111111111111111111111', & ' > 11111000000000000000000000000000', & ' > 11111111111111111111111111111111', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' DSHIFTR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 dshiftl(3fortran)', & ''] shortname="dshiftl" call process() case('92','dshiftr') textblock=[character(len=256) :: & '', & 'dshiftr(3fortran) dshiftr(3fortran)', & '', & 'NAME', & ' DSHIFTR(3) - [BIT:COPY] Combined right shift of the bits of two integers', & '', & 'SYNOPSIS', & ' result = dshiftr(i, j, shift)', & '', & ' elemental integer(kind=KIND) function dshiftr(i, j, shift)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=KIND),intent(in) :: j', & ' integer(kind=**),intent(in) :: shift', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any kind value for the integer type', & '', & ' o the kind of I, J, and the return value are the same. An exception is that', & ' one of I and J may be a BOZ literal constant (A BOZ literal constant is a', & ' binary, octal or hex constant).', & '', & ' o If either I or J is a BOZ-literal-constant, it is first converted as if', & ' by the intrinsic function INT(3) to type integer with the kind type', & ' parameter of the other.', & '', & 'DESCRIPTION', & ' DSHIFTR(3) combines bits of I and J. The leftmost SHIFT bits of the result', & ' are the rightmost SHIFT bits of I, and the remaining bits are the leftmost', & ' bits of J.', & '', & ' It may be thought of as appending the bits of I and J, dropping off the', & ' SHIFT rightmost bits, and then retaining the same number of rightmost bits', & ' as an input value, hence the name "combined right shift"...', & '', & ' Given two 16-bit values labeled alphabetically ...', & '', & ' i=ABCDEFGHIJKLMNOP', & ' j=abcdefghijklmnop', & '', & ' Append them together', & '', & ' ABCDEFGHIJKLMNOPabcdefghijklmnop', & '', & ' Shift them N=6 bits to the right dropping off bits', & '', & ' ABCDEFGHIJKLMNOPabcdefghij', & '', & ' Keep the 16 right-most bits', & '', & ' KLMNOPabcdefghij', & '', & 'NOTE', & ' DSHIFR(I,J,SHIFT) is equivalent to', & '', & ' ior(shiftl (i, bit_size(i) - shift), shiftr(j, shift) )', & '', & ' it can also be seen that if I and J have the same value', & '', & ' dshiftr( i, i, shift )', & '', & ' this has the same result as a negative circular shift', & '', & ' ishftc( i, -shift ).', & '', & 'OPTIONS', & ' o I : left value of the pair of values to be combine-shifted right', & '', & ' o J : right value of the pair of values to be combine-shifted right', & '', & ' o SHIFT : the shift value is non-negative and less than or equal to the', & ' number of bits in an input value as can be computed by BIT_SIZE(3).', & '', & 'RESULT', & ' The result is a combined right shift of I and J that is the same as the bit', & ' patterns of the inputs being combined left to right, dropping off SHIFT bits', & ' on the right and then retaining the same number of bits as an input value', & ' from the rightmost bits.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_dshiftr', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int32) :: i, j', & ' integer :: shift', & '', & ' ! basic usage', & ' write(*,*) dshiftr (1, 2**30, 2)', & '', & ' ! print some calls as binary to better visualize the results', & ' i=-1', & ' j=0', & ' shift=5', & '', & ' ! print values', & ' write(*,''(*(g0))'')''I='',i,'' J='',j,'' SHIFT='',shift', & ' write(*,''(b32.32)'') i,j, dshiftr (i, j, shift)', & '', & ' ! visualizing a "combined right shift" ...', & ' i=int(b"00000000000000000000000000011111")', & ' j=int(b"11111111111111111111111111100000")', & ' ! appended together ( i//j )', & ' ! 0000000000000000000000000001111111111111111111111111111111100000', & ' ! shifted right SHIFT values dropping off shifted values', & ' ! 00000000000000000000000000011111111111111111111111111111111', & ' ! keep enough rightmost bits to fill the kind', & ' ! 11111111111111111111111111111111', & ' ! so the result should be all 1s bits ...', & '', & ' write(*,''(*(g0))'')''I='',i,'' J='',j,'' SHIFT='',shift', & ' write(*,''(b32.32)'') i,j, dshiftr (i, j, shift)', & '', & ' end program demo_dshiftr', & '', & ' Results:', & '', & ' > 1342177280', & ' > I=-1 J=0 SHIFT=5', & ' > 11111111111111111111111111111111', & ' > 00000000000000000000000000000000', & ' > 11111000000000000000000000000000', & ' > I=31 J=-32 SHIFT=5', & ' > 00000000000000000000000000011111', & ' > 11111111111111111111111111100000', & ' > 11111111111111111111111111111111', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' DSHIFTL(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 dshiftr(3fortran)', & ''] shortname="dshiftr" call process() case('93','endfile') textblock=[character(len=256) :: & '', & 'endfile(7fortran) endfile(7fortran)', & '', & 'NAME', & ' ENDFILE(7) - [NUMERIC] Absolute value', & '', & 'SYNOPSIS', & ' endfile unit_number', & '', & 'DESCRIPTION', & ' An ENDFILE(7f) ends or truncates a file at the current record.', & '', & ' Execution of an ENDFILE(7F) statement for a file connected for SEQUENTIAL', & ' ACCESS writes an endfile record as the next record of the file. The file is', & ' then positioned after the endfile record, which becomes the last record of', & ' the file.', & '', & ' o SEQUENTIAL ACCESS : After execution of an ENDFILE(7F) statement for a', & ' file connected for sequential access, a BACKSPACE(7F) or REWIND(7F)', & ' statement shall be used to reposition the file prior to execution of any', & ' data transfer input/output statement or ENDFILE(7F) statement.', & '', & ' o DIRECT ACCESS : For a file connected for DIRECT ACCESS, only those', & ' records before the endfile record are considered to have been written.', & ' Thus, only those records or additional records subsequently written shall', & ' be read during subsequent direct access connections to the file.', & '', & ' o STREAM ACCESS : Execution of an ENDFILE(7F) statement for a file', & ' connected for STREAM ACCESS causes the terminal point of the file to', & ' become equal to the current file position. Only file storage units before', & ' the current position are considered to have been written; thus only those', & ' file storage units shall be subsequently read. Subsequent stream output', & ' statements may be used to write further data to the file.', & '', & ' Execution of an ENDFILE(7F) statement for a file that is connected but does', & ' not exist creates the file; if the file is connected for sequential access,', & ' it is created prior to writing the endfile record.', & '', & 'OPTIONS', & ' LUN', & ' A unit number of a connected file', & '', & 'EXAMPLES', & ' An example of an ENDFILE(7f) statement is:', & '', & ' program demo_endfile', & ' implicit none', & ' integer :: lun, i, j, iostat', & ' integer,parameter:: isz=10', & ' !', & ' ! create a little scratch file', & ' open(newunit=lun,file=''_scr.txt'', &', & ' & form=''formatted'', &', & ' & action=''readwrite'')', & ' write(lun,''(i0)'')(100+i,i=1,isz)', & ' !', & ' ! write end of file after reading half of file', & ' rewind(lun)', & ' write(*,*)''rewind and read'',isz/2,''lines''', & ' read(lun,*)(j,i=1,isz/2)', & ' endfile lun ! will truncate line at current position', & ' !', & ' ! NOTE: backspace before writing any addition lines', & ' ! once an ENDFILE(7f) statement is executed', & ' ! backspace(lun)', & ' !', & ' ! rewind and echo remaining file', & ' rewind(lun)', & ' j=0', & ' do i=1,huge(0)-1', & ' read(lun,*,iostat=iostat)j', & ' if(iostat.ne.0)exit', & ' write(*,*)i,j', & ' enddo', & ' write(*,*)''number of lines in file was '',isz,'', is now '',i-1', & ' close(unit=lun,status=''delete'')', & ' end program demo_endfile', & '', & 'SEE ALSO', & ' BACKSPACE(7), CLOSE(7), ENDFILE(7), FLUSH(7), INQUIRE(7), OPEN(7), PRINT(7),', & ' READ(7), REWIND(7), WAIT(7), WRITE(7)', & '', & ' March 16, 2025 endfile(7fortran)', & ''] shortname="endfile" call process() case('94','eoshift') textblock=[character(len=256) :: & '', & 'eoshift(3fortran) eoshift(3fortran)', & '', & 'NAME', & ' EOSHIFT(3) - [ARRAY:TRANSFORMATIONAL] End-off shift of elements of an array', & '', & 'SYNOPSIS', & ' result = eoshift( array, shift [,boundary] [,dim] )', & '', & ' type(TYPE(kind=KIND)) function eoshift(array,shift,boundary,dim)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: array(..)', & ' integer(kind=**),intent(in) :: shift(..)', & ' type(TYPE(kind=KIND)),intent(in) :: boundary(..)', & ' integer(kind=**),intent(in) :: dim', & '', & 'CHARACTERISTICS', & ' o ARRAY an array of any type', & '', & ' o SHIFT is an integer of any kind. It may be a scalar. If the rank of ARRAY', & ' is greater than one, and DIM is specified it is the same shape as ARRAY', & ' reduced by removing dimension DIM.', & '', & ' o BOUNDARY May be a scalar of the same type and kind as ARRAY. It must be a', & ' scalar when ARRAY has a rank of one. Otherwise, it may be an array of the', & ' same shape as ARRAY reduced by dimension DIM. It may only be absent for', & ' certain types, as described below.', & '', & ' o DIM is an integer of any kind. It defaults to one.', & '', & ' o the result has the same type, type parameters, and shape as ARRAY.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o The result is an array of same type, kind and rank as the ARRAY argument.', & '', & 'DESCRIPTION', & ' EOSHIFT(3) performs an end-off shift on elements of ARRAY along the', & ' dimension of DIM.', & '', & ' Elements shifted out one end of each rank one section are dropped.', & '', & ' If BOUNDARY is present then the corresponding value from BOUNDARY is copied', & ' back in the other end, else default values are used.', & '', & 'OPTIONS', & ' o ARRAY : array of any type whose elements are to be shifted. If the rank', & ' of ARRAY is one, then all elements of ARRAY are shifted by SHIFT places.', & ' If rank is greater than one, then all complete rank one sections of ARRAY', & ' along the given dimension are shifted.', & '', & ' o SHIFT : the number of elements to shift. A negative value shifts to the', & ' right, a positive value to the left of the vector(s) being shifted.', & '', & ' o BOUNDARY : the value to use to fill in the elements vacated by the shift.', & ' If BOUNDARY is not present then the following are copied in depending on', & ' the type of ARRAY.', & '', & ' Array Type | Boundary Value', & ' -----------------------------------------------------', & ' Numeric | 0, 0.0, or (0.0, 0.0) of the type and kind of "array"', & ' Logical | .false.', & ' Character(len)| LEN blanks', & '', & ' These are the only types for which BOUNDARY may not be present. For these', & ' types the kind is converted as neccessary to the kind of ARRAY.', & '', & ' o DIM : DIM is in the range of', & '', & ' 1 <= DIM <= n', & '', & ' where "N" is the rank of ARRAY. If DIM is omitted it is taken to be 1.', & '', & 'RESULT', & ' Returns an array of the same characteristics as the input with the specified', & ' number of elements dropped off along the specified direction indicated,', & ' backfilling the vacated elements with a value indicated by the BOUNDARY', & ' value.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_eoshift', & ' implicit none', & ' integer, dimension(3,3) :: a', & ' integer :: i', & '', & ' write(*,*)''original''', & ' a = reshape( [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], [ 3, 3 ])', & ' call printi(a)', & '', & ' write(*,*)''shift each row differently''', & ' a = eoshift(a, SHIFT=[1, 2, -2], BOUNDARY=-5, DIM=2)', & ' call printi(a)', & '', & ' write(*,*)''shift each column differently''', & ' a = eoshift(a, SHIFT=[1, 2, -2], BOUNDARY=-5, DIM=1)', & ' call printi(a)', & '', & ' write(*,*)''original''', & ' call printi(reshape([(i,i=1,12)],[3,4]))', & ' write(*,''(*(g0))'')''shift=+2,dim=1''', & ' call printi(eoshift(reshape([(i,i=1,12)],[3,4]),+2,dim=1))', & ' write(*,''(*(g0))'')''shift=+2,dim=2''', & ' call printi(eoshift(reshape([(i,i=1,12)],[3,4]),+2,dim=2))', & ' write(*,''(*(g0))'')''shift=-2,dim=1''', & ' call printi(eoshift(reshape([(i,i=1,12)],[3,4]),-2,dim=1))', & ' write(*,''(*(g0))'')''shift=-2,dim=2''', & ' call printi(eoshift(reshape([(i,i=1,12)],[3,4]),-2,dim=2))', & ' contains', & ' subroutine printi(arr)', & ' !@(#) print small 2d integer arrays in row-column format', & ' integer,intent(in) :: arr(:,:)', & ' integer :: i', & ' character(len=40) :: biggest', & ' write(biggest,''(*(g0))'')''(1x,*(i'', &', & ' & ceiling(log10(max(1.0,real(maxval(abs(arr))))))+2, &', & ' & '':,","))''', & ' do i=1,size(arr,dim=1)', & ' write(*,fmt=biggest)arr(i,:)', & ' enddo', & ' end subroutine printi', & '', & ' end program demo_eoshift', & '', & ' Results:', & '', & ' > original', & ' > 1, 4, 7', & ' > 2, 5, 8', & ' > 3, 6, 9', & ' > shift each row differently', & ' > 4, 7, -5', & ' > 8, -5, -5', & ' > -5, -5, 3', & ' > shift each column differently', & ' > 8, -5, -5', & ' > -5, -5, -5', & ' > -5, -5, -5', & ' > original', & ' > 1, 4, 7, 10', & ' > 2, 5, 8, 11', & ' > 3, 6, 9, 12', & ' > shift=+2,dim=1', & ' > 3, 6, 9, 12', & ' > 0, 0, 0, 0', & ' > 0, 0, 0, 0', & ' > shift=+2,dim=2', & ' > 7, 10, 0, 0', & ' > 8, 11, 0, 0', & ' > 9, 12, 0, 0', & ' > shift=-2,dim=1', & ' > 0, 0, 0, 0', & ' > 0, 0, 0, 0', & ' > 1, 4, 7, 10', & ' > shift=-2,dim=2', & ' > 0, 0, 1, 4', & ' > 0, 0, 2, 5', & ' > 0, 0, 3, 6', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DSHIFTR(3), DSHIFTL(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 eoshift(3fortran)', & ''] shortname="eoshift" call process() case('95','epsilon') textblock=[character(len=256) :: & '', & 'epsilon(3fortran) epsilon(3fortran)', & '', & 'NAME', & ' EPSILON(3) - [MODEL:NUMERIC] Epsilon function', & '', & 'SYNOPSIS', & ' result = epsilon(x)', & '', & ' real(kind=kind(x)) function epsilon(x)', & '', & ' real(kind=kind(x),intent(in) :: x(..)', & '', & 'CHARACTERISTICS', & ' o X shall be of type real. It may be a scalar or an array.', & '', & ' o the result is a scalar of the same type and kind type parameter as X.', & '', & 'DESCRIPTION', & ' EPSILON(3) returns the floating point relative accuracy. It is the nearly', & ' negligible number relative to 1 such that 1+ LITTLE_NUMBER is not equal to', & ' 1; or more precisely', & '', & ' real( 1.0, kind(x)) + epsilon(x) /= real( 1.0, kind(x))', & '', & ' It may be thought of as the distance from 1.0 to the next largest floating', & ' point number.', & '', & ' One use of EPSILON(3) is to select a delta value for algorithms that search', & ' until the calculation is within delta of an estimate.', & '', & ' If delta is too small the algorithm might never halt, as a computation', & ' summing values smaller than the decimal resolution of the data type does not', & ' change.', & '', & 'OPTIONS', & ' o X : The type shall be real.', & '', & 'RESULT', & ' The return value is of the same type as the argument.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_epsilon', & ' use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32', & ' implicit none', & ' real(kind=sp) :: x = 3.143', & ' real(kind=dp) :: y = 2.33d0', & '', & ' ! so if x is of type real32, epsilon(x) has the value 2**-23', & ' print *, epsilon(x)', & ' ! note just the type and kind of x matter, not the value', & ' print *, epsilon(huge(x))', & ' print *, epsilon(tiny(x))', & '', & ' ! the value changes with the kind of the real value though', & ' print *, epsilon(y)', & '', & ' ! adding and subtracting epsilon(x) changes x', & ' write(*,*)x == x + epsilon(x)', & ' write(*,*)x == x - epsilon(x)', & '', & ' ! these next two comparisons will be .true. !', & ' write(*,*)x == x + epsilon(x) * 0.999999', & ' write(*,*)x == x - epsilon(x) * 0.999999', & '', & ' ! you can calculate epsilon(1.0d0)', & ' write(*,*)my_dp_eps()', & '', & ' contains', & '', & ' function my_dp_eps()', & ' ! calculate the epsilon value of a machine the hard way', & ' real(kind=dp) :: t', & ' real(kind=dp) :: my_dp_eps', & '', & ' ! starting with a value of 1, keep dividing the value', & ' ! by 2 until no change is detected. Note that with', & ' ! infinite precision this would be an infinite loop,', & ' ! but floating point values in Fortran have a defined', & ' ! and limited precision.', & ' my_dp_eps = 1.0d0', & ' SET_ST: do', & ' my_dp_eps = my_dp_eps/2.0d0', & ' t = 1.0d0 + my_dp_eps', & ' if (t <= 1.0d0) exit', & ' enddo SET_ST', & ' my_dp_eps = 2.0d0*my_dp_eps', & '', & ' end function my_dp_eps', & ' end program demo_epsilon', & '', & ' Results:', & '', & ' > 1.19209290E-07', & ' > 1.19209290E-07', & ' > 1.19209290E-07', & ' > 2.2204460492503131E-016', & ' > F', & ' > F', & ' > T', & ' > T', & ' > 2.2204460492503131E-016', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3),', & ' SCALE(3), SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 epsilon(3fortran)', & ''] shortname="epsilon" call process() case('96','erf') textblock=[character(len=256) :: & '', & 'erf(3fortran) erf(3fortran)', & '', & 'NAME', & ' ERF(3) - [MATHEMATICS] Error function', & '', & 'SYNOPSIS', & ' result = erf(x)', & '', & ' elemental real(kind=KIND) function erf(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is of type real', & '', & ' o The result is of the same type and kind as X.', & '', & 'DESCRIPTION', & ' ERF(3) computes the error function of X, defined as', & '', & ' $$ \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-T^2} dt. $$', & '', & 'OPTIONS', & ' o X : The type shall be real.', & '', & 'RESULT', & ' The return value is of type real, of the same kind as X and lies in the', & ' range -1 <= ERF(x) <= 1 .', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_erf', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 0.17_real64', & ' write(*,*)x, erf(x)', & ' end program demo_erf', & '', & ' Results:', & '', & ' > 0.17000000000000001 0.18999246120180879', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' ERFC(3), ERF_SCALED(3)', & '', & 'RESOURCES', & ' o Wikipedia:error function', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 erf(3fortran)', & ''] shortname="erf" call process() case('97','erfc') textblock=[character(len=256) :: & '', & 'erfc(3fortran) erfc(3fortran)', & '', & 'NAME', & ' ERFC(3) - [MATHEMATICS] Complementary error function', & '', & 'SYNOPSIS', & ' result = erfc(x)', & '', & ' elemental real(kind=KIND) function erfc(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is of type real and any valid kind', & '', & ' o KIND is any value valid for type real', & '', & ' o the result has the same characteristics as X', & '', & 'DESCRIPTION', & ' ERFC(3) computes the complementary error function of X. Simply put this is', & ' equivalent to 1 - ERF(X), but ERFC is provided because of the extreme loss', & ' of relative accuracy if ERF(X) is called for large X and the result is', & ' subtracted from 1.', & '', & ' ERFC(X) is defined as', & '', & ' $$ \text{erfc}(x) = 1 - \text{erf}(x) = 1 - \frac{2}{\sqrt{\pi}}', & ' \int_x^{\infty} e^{-t^2} dt. $$', & '', & 'OPTIONS', & ' o X : The type shall be real.', & '', & 'RESULT', & ' The return value is of type real and of the same kind as X. It lies in the', & ' range', & '', & ' 0 <= erfc(x) <= 2.', & '', & ' and is a processor-dependent approximation to the complementary error', & ' function of X ( 1-ERF(X) ).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_erfc', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 0.17_real64', & ' write(*,''(*(g0))'')''X='',x, '' ERFC(X)='',erfc(x)', & ' write(*,''(*(g0))'')''equivalently 1-ERF(X)='',1-erf(x)', & ' end program demo_erfc', & '', & ' Results:', & '', & ' > X=.1700000000000000 ERFC(X)=.8100075387981912', & ' > equivalently 1-ERF(X)=.8100075387981912', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' ERF(3) ERF_SCALED(3)', & '', & 'RESOURCES', & ' o Wikipedia:error function', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 erfc(3fortran)', & ''] shortname="erfc" call process() case('98','erfc_scaled') textblock=[character(len=256) :: & '', & 'erfc_scaled(3fortran) erfc_scaled(3fortran)', & '', & 'NAME', & ' ERFC_SCALED(3) - [MATHEMATICS] Scaled complementary error function', & '', & 'SYNOPSIS', & ' result = erfc_scaled(x)', & '', & ' elemental real(kind=KIND) function erfc_scaled(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is of type real of any valid kind', & '', & ' o KIND is any kind valid for a real type', & '', & ' o the result has the same characteristics as X', & '', & 'DESCRIPTION', & ' ERFC_SCALED(3) computes the exponentially-scaled complementary error', & ' function of X:', & '', & ' $$ e^{x^2} \frac{2}{\sqrt{\pi}} \int_{x}^{\infty} e^{-t^2} dt. $$', & '', & ' erfc_scaled(x)=exp(x*x)erfc(x)', & '', & ' NOTE1', & '', & ' The complementary error function is asymptotic to exp(-X2)/(X/PI). As such', & ' it underflows at approximately X >= 9 when using ISO/IEC/IEEE 60559:2011', & ' single precision arithmetic. The exponentially-scaled complementary error', & ' function is asymptotic to 1/(X PI). As such it does not underflow until X >', & ' HUGE (X)/PI.', & '', & 'OPTIONS', & ' o X the value to apply the ERFC function to', & '', & 'RESULT', & ' The approximation to the exponentially-scaled complementary error function', & ' of X', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_erfc_scaled', & ' implicit none', & ' real(kind(0.0d0)) :: x = 0.17d0', & ' x = erfc_scaled(x)', & ' print *, x', & ' end program demo_erfc_scaled', & '', & ' Results:', & '', & ' > 0.833758302149981', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' ERF(3), EXP(3), ERFC(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 erfc_scaled(3fortran)', & ''] shortname="erfc_scaled" call process() case('99','event_query') textblock=[character(len=256) :: & '', & 'event_query(3fortran) event_query(3fortran)', & '', & 'NAME', & ' EVENT_QUERY(3) - [COLLECTIVE] Query whether a coarray event has occurred', & '', & 'SYNOPSIS', & ' call event_query(event, count [,stat] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' EVENT_QUERY(3) assigns the number of events to COUNT which have been posted', & ' to the EVENT variable and not yet been removed by calling EVENT_WAIT. When', & ' STAT is present and the invocation was successful, it is assigned the value', & ' 0. If it is present and the invocation has failed, it is assigned a positive', & ' value and COUNT is assigned the value -1.', & '', & 'OPTIONS', & ' o EVENT : (intent(in)) Scalar of type event_type, defined in', & ' iso_fortran_env; shall not be coindexed.', & '', & ' o COUNT : (intent(out))Scalar integer with at least the precision of', & ' default integer.', & '', & ' o STAT : (OPTIONAL) Scalar default-kind integer variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_event_query', & ' use iso_fortran_env', & ' implicit none', & ' type(event_type) :: event_value_has_been_set[*]', & ' integer :: cnt', & ' if (this_image() == 1) then', & ' call event_query(event_value_has_been_set, cnt)', & ' if (cnt > 0) write(*,*) "Value has been set"', & ' elseif (this_image() == 2) then', & ' event post(event_value_has_been_set[1])', & ' endif', & ' end program demo_event_query', & '', & 'STANDARD', & ' TS 18508', & '', & 'SEE ALSO', & ' o co_broadcast(3) - Copy a value to all images the current set of images', & '', & ' o co_lbound(3) - Lower codimension bounds of an array', & '', & ' o co_max(3) - Maximal value on the current set of images', & '', & ' o co_min(3) - Minimal value on the current set of images', & '', & ' o co_reduce(3) - Reduction of values on the current set of images', & '', & ' o co_sum(3) - Sum of values on the current set of images', & '', & ' o co_ubound(3) - Upper codimension bounds of an array', & '', & ' o event_query(3) - Query whether a coarray event has occurred', & '', & ' o image_index(3) - Cosubscript to image index conversion', & '', & ' o lcobound(3) - Lower codimension bounds of an array', & '', & ' o num_images(3) - Number of images', & '', & ' o this_image(3) - Cosubscript index of this image', & '', & ' o ucobound(3) - Upper codimension bounds of an array', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 event_query(3fortran)', & ''] shortname="event_query" call process() case('100','execute_command_line') textblock=[character(len=256) :: & '', & 'execute_command_line(3fortran) execute_command_line(3fortran)', & '', & 'NAME', & ' EXECUTE_COMMAND_LINE(3) - [SYSTEM:PROCESSES] Execute a shell command', & '', & 'SYNOPSIS', & ' call execute_command_line( & & command [,wait] [,exitstat] [,cmdstat]', & ' [,cmdmsg] )', & '', & ' subroutine execute_command_line(command,wait,exitstat,cmdstat,cmdmsg)', & '', & ' character(len=*),intent(in) :: command', & ' logical,intent(in),optional :: wait', & ' integer,intent(inout),optional :: exitstat', & ' integer,intent(inout),optional :: cmdstat', & ' character(len=*),intent(inout),optional :: cmdmsg', & '', & 'CHARACTERISTICS', & ' o COMMAND is a default character scalar', & '', & ' o WAIT is a default logical scalar.', & '', & ' o EXITSTAT is an integer of the default kind. It must be of a kind with at', & ' least a decimal exponent range of 9.', & '', & ' o CMDSTAT is an integer of default kind. The kind of the variable must', & ' support at least a decimal exponent range of four.', & '', & ' o CMDMSG is a character scalar of the default kind.', & '', & 'DESCRIPTION', & ' For EXECUTE_COMMAND_LINE(3) the COMMAND argument is passed to the shell and', & ' executed. (The shell is generally SH(1) on Unix systems, and cmd.exe on', & ' Windows.) If WAIT is present and has the value .false., the execution of the', & ' command is asynchronous if the system supports it; otherwise, the command is', & ' executed synchronously.', & '', & ' The three last arguments allow the user to get status information. After', & ' synchronous execution, EXITSTAT contains the integer exit code of the', & ' command, as returned by SYSTEM. CMDSTAT is set to zero if the command line', & ' was executed (whatever its exit status was). CMDMSG is assigned an error', & ' message if an error has occurred.', & '', & ' Note that the system call need not be thread-safe. It is the responsibility', & ' of the user to ensure that the system is not called concurrently if', & ' required.', & '', & ' When the command is executed synchronously, EXECUTE_COMMAND_LINE returns', & ' after the command line has completed execution. Otherwise,', & ' EXECUTE_COMMAND_LINE returns without waiting.', & '', & ' Because this intrinsic is making a system call, it is very system dependent.', & ' Its behavior with respect to signaling is processor dependent. In', & ' particular, on POSIX-compliant systems, the SIGINT and SIGQUIT signals will', & ' be ignored, and the SIGCHLD will be blocked. As such, if the parent process', & ' is terminated, the child process might not be terminated alongside.', & '', & ' One of the most common causes of errors is that the program requested is not', & ' in the search path. You should make sure that the program to be executed is', & ' installed on your system and that it is in the system''s path when the', & ' program calls it. You can check if it is installed by running it from the', & ' command prompt. If it runs successfully from the command prompt, it means', & ' that it is installed, and so you should next check that it is in the search', & ' path when the program executes (usually this means checking the environment', & ' variable PATH).', & '', & 'OPTIONS', & ' o COMMAND : the command line to be executed. The interpretation is', & ' programming-environment dependent.', & '', & ' o WAIT : If WAIT is present with the value .false., and the processor', & ' supports asynchronous execution of the command, the command is executed', & ' asynchronously; otherwise it is executed synchronously.', & '', & ' When the command is executed synchronously, EXECUTE_COMMAND_LINE(3)', & ' returns after the command line has completed execution. Otherwise,', & ' EXECUTE_COMMAND_LINE(3) returns without waiting.', & '', & ' o EXITSTAT : If the command is executed synchronously, it is assigned the', & ' value of the processor-dependent exit status. Otherwise, the value of', & ' EXITSTAT is unchanged.', & '', & ' o CMDSTAT : If an error condition occurs and CMDSTAT is not present, error', & ' termination of execution of the image is initiated.', & '', & ' It is assigned the value -1 if the processor does not support command', & ' line execution, a processor-dependent positive value if an error', & ' condition occurs, or the value -2 if no error condition occurs but WAIT', & ' is present with the value false and the processor does not support', & ' asynchronous execution. Otherwise it is assigned the value 0.', & '', & ' o CMDMSG : If an error condition occurs, it is assigned a processor-', & ' dependent explanatory message. Otherwise, it is unchanged.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_execute_command_line', & ' implicit none', & ' integer :: exitstat, cmdstat', & ' character(len=256) :: cmdmsg', & '', & ' call execute_command_line( &', & ' & command = "external_prog.exe", &', & ' & exitstat = exitstat, &', & ' & cmdstat = cmdstat, &', & ' & cmdmsg = cmdmsg)', & ' print *, "Exit status of external_prog.exe was ", exitstat', & ' if(cmdstat.ne.0)then', & ' print *, ''<ERROR>''//trim(cmdmsg)', & ' endif', & '', & ' ! if asynchronous exitstat and cmdstat may not be relied on', & ' call execute_command_line("reindex_files.exe", wait=.false.)', & ' print *, "Now hopefully reindexing files in the background"', & '', & ' if(cmd(''dir''))then', & ' write(*,*)''OK''', & ' else', & ' stop 4', & ' endif', & '', & ' ! might short-circuit or not if a command fails', & ' if(all(cmd([character(len=80) :: ''date'',''time myprg'',''date''])))then', & ' write(*,*)''good time''', & ' else', & ' write(*,*)''bad time''', & ' endif', & '', & ' stop ''end of program''', & ' contains', & '', & ' elemental impure function cmd(command)', & ' ! a functional interface for calling system commands', & ' use, intrinsic :: iso_fortran_env, only : &', & ' & stderr=>ERROR_UNIT, stdout=>OUTPUT_UNIT', & ' character(len=*),intent(in) :: command', & ' logical :: cmd', & ' logical :: wait', & ' integer :: exitstat', & ' integer :: cmdstat', & ' character(len=256) :: cmdmsg', & ' wait=.false.', & ' exitstat=0', & ' cmdstat=0', & ' call execute_command_line(command=command,wait=wait, &', & ' & exitstat=exitstat,cmdstat=cmdstat,cmdmsg=cmdmsg)', & ' if(cmdstat.ne.0)then', & ' flush(stdout)', & ' write(stderr,''(a)'')trim(cmdmsg)', & ' flush(stderr)', & ' endif', & ' if(exitstat.ne.0)then', & ' flush(stdout)', & ' write(stderr,''(*(g0))'')''exitstat='',exitstat,'':'',trim(command)', & ' flush(stderr)', & ' endif', & ' cmd=merge(.true.,.false.,exitstat==0)', & ' end function cmd', & '', & ' end program demo_execute_command_line', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' GET_ENVIRONMENT_VARIABLE(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 execute_command_line(3fortran)', & ''] shortname="execute_command_line" call process() case('101','exit') textblock=[character(len=256) :: & '', & 'exit(7fortran) exit(7fortran)', & '', & 'NAME', & ' EXIT(7f) - [EXECUTION CONTROL] terminate do-loops and block constructs', & '', & 'SYNOPSIS', & ' EXIT [construct-name]', & '', & 'DESCRIPTION', & ' *exit statements can terminate do-loops but also can exit most named block', & ' constructs. First ...', & '', & ' EXIT STATEMENTS CAN TERMINATE DO-LOOP CONSTRUCTS', & '', & ' The EXIT statement most commonly terminates a DO or DO WHILE loop.', & '', & ' The related CYCLE statement immediately begins the next loop cycle versus', & ' terminating the loop.', & '', & ' An unnamed EXIT statement must be within a DO loop and if executed it exits', & ' the innermost DO within which it appears, terminating that loop.', & '', & ' If it is desired to exit nested do-loops the do-loop must be labeled with a', & ' name, which the EXIT then refers to.', & '', & ' The DO CONTROL VARIABLES RETAIN THEIR LAST VALUE. That is if a DO loop is', & ' terminated by and EXIT any additional inner DO loops are also terminated,', & ' but all DO LOOP control variables retain their last value; assuming they are', & ' still in scope.', & '', & 'WITH A CONSTRAINT NAME EXIT CAN TERMINATE MOST BLOCK CONSTRUCTS', & ' Named EXIT statements can also complete execution of other (named) block', & ' constructs(eg. a BLOCK construct, an ASSOCIATE construct, ...).', & '', & ' If a construct name appears on an EXIT, the EXIT statement must be within', & ' that construct. That is, an EXIT jumps to the end of the associated', & ' construct only from within that very same construct.', & '', & ' If a non-DO construct is terminated, any DO loops inside that construct are', & ' of course also terminated.', & '', & ' That stipulated, an EXIT statement can appear in any of the following', & ' constructs:', & '', & ' o ASSOCIATE construct', & '', & ' o BLOCK construct', & '', & ' o IF construct', & '', & ' o SELECT CASE construct', & '', & ' o SELECT RANK construct', & '', & ' o SELECT TYPE construct', & '', & ' o DO construct', & '', & ' o CHANGETEAM construct', & '', & ' o CRITICAL construct', & '', & ' Note specifically what is missing -- WHERE and FORALL constructs cannot have', & ' EXIT statements associated with them.', & '', & ' A few additional restrictions apply, primarily for potentially parallel', & ' regions.', & '', & ' o An EXIT statement cannot cannot terminate a DO CONCURRENT construct', & ' because the execution order of the iterations is allowed to be', & ' indeterminate -- so an exit would result in an unknown state.', & '', & ' o For related reasons jumping out of a parallel region to the exit of', & ' another block construct could skip steps that would leave a parallel', & ' program in an unknown state. Therefore EXIT statements in a DO', & ' CONCURRENT, CHANGE TEAM or CRITICAL construct cannot reference an outer', & ' construct.', & '', & ' o An exit from a CHANGE TEAM construct does not just resume execution after', & ' the end of the construct. The effect is the same as transferring control', & ' to the END TEAM statement, including that if that statement contains a', & ' STAT= or ERRMSG= specifier, the STAT variable or ERRMSG variable becomes', & ' defined.', & '', & 'OPTIONS', & ' CONSTRUCT-NAME (Optional for DO-LOOP exits) Is the name of the DO-LOOP or', & ' block construct. Note the construct names must be unique within the same', & ' scope.', & '', & ' Unnamed EXIT statements could introduce errors when loop nesting is', & ' modified. Therefore names are strongly recommended accept perhaps where the', & ' loop comprises only a few lines of code.', & '', & 'EXAMPLES', & ' Samples:', & '', & ' program demo_exit', & ' implicit none', & ' integer,parameter :: arbitrary_size=10', & ' integer :: i, j, k, iarr(arbitrary_size)', & ' integer :: iostat, lun', & ' logical :: ok', & ' character(len=80) :: line', & ' character(len=*),parameter :: gen=''(*(g0:,1x))''', & ' !', & ' ! the basics', & ' !', & ' ! Note we will use the function irand(3f) contained in', & ' ! the end of the code below to generate random whole numbers', & ' !', & ' !----------------------', & ' ! EXIT an infinite loop', & ' !----------------------', & ' i=0', & ' do', & ' i=i+1', & ' ! we will test on a random value to simulate an actual criteria', & ' ! to meet that indicates the loop should be terminated', & ' if(irand(-100,100).gt.95)exit', & ' enddo', & ' print gen, ''escaped infinite loop after only '',i,''tries''', & '', & ' ! a related common use is to read a file of unknown size', & ' ! till an error or end-of-file, although READ does have', & ' ! the options ERR=numeric-label and EOF=numeric-label.', & ' ! INFINITE: do', & ' ! read(*,''(a)'',iostat=iostat) line', & ' ! if(iostat.ne.0)exit INFINITE', & ' ! enddo INFINITE', & '', & ' ! Some argue that an infinite loop is never a good idea.', & ' ! A common practice is to avoid even the possibility of an', & ' ! infinite loop by putting a cap on the number of iterations', & ' ! that should "never" occur, and then error processing', & ' ! if the unexpected number of loops is inadvertently reached.', & ' ! This technique can let your code gracefully handle being used with', & ' ! problems bigger than it was intended for, or not loop infinitely', & ' ! if some unexpected or incorrect input or condition is encountered.', & ' ! It might make it stop unitentionally as well.', & ' !', & ' ! run a loop but quit as soon as 200 random integers are odd', & ' j=0', & ' ! fun facts: What are the odds of not getting 200 in 10000?', & ' do i=1, 10000', & ' k=irand(0,99)', & ' if((k+1)/2 /= k/2)j=j+1 ! cheap integer math trick to tell if odd', & ' if(j .ge. 200) exit', & ' enddo', & ' if(j.lt.200) then', & ' print gen,''Oh no! Not enough odd samples. only found'',j', & ' print gen,''That is REALLY unlikely.''', & ' stop ''<ERROR> unexpectedly low number of odd values''', & ' else', & ' print gen,''only did I='',i,''passes to get 200 odd samples''', & ' endif', & ' ! ---------------------------', & ' ! how to EXIT nested do-loops', & ' ! ---------------------------', & ' ! EXIT with no name only exits an innermost loop', & ' ! so in the following k will be 3, as all passes of the', & ' ! outer loop still occur', & ' k=0', & ' do i=1,3', & ' do j=1,5', & ' exit', & ' enddo', & ' k=k+1', & ' enddo', & ' ! at the end of a completed loop the counter is end_limit+step so', & ' ! you can tell if you exhausted the do loop or exited early:', & ' print gen,''I='',i,''so '',&', & ' & merge(''completed'',''exited '',i.gt.3),'' outer loop''', & ' print gen,''J='',j,''so '',&', & ' & merge(''completed'',''exited '',j.gt.5),'' inner loop''', & ' print gen,''K='',k', & '', & ' ! COMMENTARY:', & ' ! A labeled exit is less prone to error so generally worth the', & ' ! additional verbosity even when just exiting an inner loop.', & ' ! Without a label an EXIT is somewhat like saying "EXIT SOMEWHERE".', & '', & ' ! It is simple to EXIT nested loops from an inner loop.', & ' ! Just use a construct name. Lets start with the nested loop above', & ' ! that only repeatedly exited the inner loop and label the outer', & ' ! loop "OUTER". Now our exit can explicity name what loop it wants', & ' ! to exit ...', & '', & ' k=0', & ' OUTER: do i=1,3', & ' do j=1,5', & ' exit OUTER', & ' enddo', & ' k=k+1', & ' enddo OUTER', & ' if(i==1.and.j==1.and.k==0)then', & ' print gen,''exited nested loops successfully as expected''', & ' else', & ' print gen,''something went wrong, i='',i,''j='',j,''k='',k', & ' endif', & '', & ' ! ---------------------------------------', & ' ! exits from non-DO-loop block constructs', & ' ! ---------------------------------------', & ' ! REMEMBER: non-DO-loop exits are always named', & '', & ' !----------------------------------------------------------------------', & ' ! EXIT a BLOCK statement surrounding a loop to avoid the nefarious GOTO', & ' !----------------------------------------------------------------------', & ' ! look for a 5 in an array that should always have it', & ' iarr=[(i,i=1,size(iarr))] ! fill array with 1 to N', & ' LOOKFOR: block', & ' do i=1,size(iarr)', & ' ! when you find what you are looking for use an EXIT instead', & ' ! of a GOTO , which follows much more restricted rules on', & ' ! on where you can land, preventing the threat of spaghetti code', & ' if(iarr(i).eq.5) exit LOOKFOR', & ' enddo', & ' write(*,*)''should not get here. iarr='',iarr', & ' stop ''<INTERNAL ERROR> should never get here! is array too small?''', & ' endblock LOOKFOR', & ' print gen,''Good Found 5 at position I='',i,''so exited BLOCK construct''', & '', & ' !--------------', & ' ! Dusty corners', & ' !--------------', & '', & ' ! a block contained completely within a DO CONCURRENT can', & ' ! be exited even though the DO CONCURRENT itself or an outer block', & ' ! cannot be terminated from within a DO CONCURRENT', & ' do concurrent (i = 1:10)', & ' INCC: block', & ' real :: t', & ' t = 0.0', & ' if (t == 0.0) exit INCC', & ' t= t+1.0', & ' end block INCC', & ' end do', & '', & ' ! The following example shows illegal EXIT statements in DO CONCURRENT', & ' ! and CRITICAL:', & '', & ' ! can t EXIT DO CONCURRENT or outer construct of a DO CONCURRENT', & ' !x!N=4', & ' !x!LOOP_1 : DO CONCURRENT (I = 1:N)', & ' !x! N = N + 1', & ' !x! IF (N > I) EXIT LOOP_1', & ' !x!END DO LOOP_1', & '', & ' !x!LOOP_2 : DO I = 1, 15', & ' !x! CRITICAL', & ' !x! N = N + 1', & ' !x! IF (N > I) EXIT LOOP_2 ! cannott EXIT outer construct from inside', & ' !x! END CRITICAL ! CHANGE TEAM, DO CONCURRENT, or CRITICAL', & ' !x!END DO LOOP_2', & '', & ' ! this would fail', & ' ! because the same construct name was used in the same scope:', & ' !x! LEVELA block:', & ' !x! exit LEVELA', & ' !x! endblock LEVELA', & ' !x!', & ' !x! LEVELA block:', & ' !x! exit LEVELA', & ' !x! endblock LEVELA', & '', & ' contains', & ' ! choose a value from range of integers inclusive randomly', & ' function irand(first,last)', & ' integer, allocatable :: seed(:)', & ' integer,intent(in) :: first,last', & ' real :: rand_val', & ' integer :: irand', & ' call random_number(rand_val)', & ' irand = first + floor((last+1-first)*rand_val)', & ' end function irand', & ' end program demo_exit', & '', & ' Results:', & '', & ' > escaped infinite loop after only 71 tries', & ' > only did I= 426 passes to get 200 odd samples', & ' > I= 4 so completed outer loop', & ' > J= 1 so exited inner loop', & ' > K= 3', & ' > exited nested loops successfully as expected', & ' > Good Found 5 at position I= 5 so exited BLOCK construct', & '', & 'SEE ALSO', & ' o CYCLE(3)', & '', & ' o RETURN(3)', & '', & ' o STOP(3)', & '', & ' o DO(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 exit(7fortran)', & ''] shortname="exit" call process() case('102','exp') textblock=[character(len=256) :: & '', & 'exp(3fortran) exp(3fortran)', & '', & 'NAME', & ' EXP(3) - [MATHEMATICS] Base-e exponential function', & '', & 'SYNOPSIS', & ' result = exp(x)', & '', & ' elemental TYPE(kind=KIND) function exp(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X may be real or complex of any kind.', & '', & ' o The return value has the same type and kind as X.', & '', & 'DESCRIPTION', & ' EXP(3) returns the value of e (the base of natural logarithms) raised to the', & ' power of X.', & '', & ' "e" is also known as Euler''s constant.', & '', & ' If X is of type complex, its imaginary part is regarded as a value in', & ' radians such that if (see Euler''s formula):', & '', & ' cx=(re,im)', & '', & ' then', & '', & ' exp(cx) = exp(re) * cmplx(cos(im),sin(im),kind=kind(cx))', & '', & ' Since EXP(3) is the inverse function of LOG(3) the maximum valid magnitude', & ' of the real component of X is LOG(HUGE(X)).', & '', & 'OPTIONS', & ' o X : The type shall be real or complex.', & '', & 'RESULT', & ' The value of the result is E**X where E is Euler''s constant.', & '', & ' If X is of type complex, its imaginary part is regarded as a value in', & ' radians.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_exp', & ' implicit none', & ' real :: x, re, im', & ' complex :: cx', & '', & ' x = 1.0', & ' write(*,*)"Euler''s constant is approximately",exp(x)', & '', & ' !! complex values', & ' ! given', & ' re=3.0', & ' im=4.0', & ' cx=cmplx(re,im)', & '', & ' ! complex results from complex arguments are Related to Euler''s formula', & ' write(*,*)''given the complex value '',cx', & ' write(*,*)''exp(x) is'',exp(cx)', & ' write(*,*)''is the same as'',exp(re)*cmplx(cos(im),sin(im),kind=kind(cx))', & '', & ' ! exp(3) is the inverse function of log(3) so', & ' ! the real component of the input must be less than or equal to', & ' write(*,*)''maximum real component'',log(huge(0.0))', & ' ! or for double precision', & ' write(*,*)''maximum doubleprecision component'',log(huge(0.0d0))', & '', & ' ! but since the imaginary component is passed to the cos(3) and sin(3)', & ' ! functions the imaginary component can be any real value', & '', & ' end program demo_exp', & '', & ' Results:', & '', & ' > Euler''s constant is approximately 2.71828175', & ' > given the complex value (3.00000000,4.00000000)', & ' > exp(x) is (-13.1287832,-15.2007847)', & ' > is the same as (-13.1287832,-15.2007847)', & ' > maximum real component 88.7228394', & ' > maximum doubleprecision component 709.78271289338397', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o LOG(3)', & '', & 'RESOURCES', & ' o Wikipedia:Exponential function', & '', & ' o Wikipedia:Euler''s formula', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 exp(3fortran)', & ''] shortname="exp" call process() case('103','exponent') textblock=[character(len=256) :: & '', & 'exponent(3fortran) exponent(3fortran)', & '', & 'NAME', & ' EXPONENT(3) - [MODEL:COMPONENTS] Exponent of floating-point number', & '', & 'SYNOPSIS', & ' result = exponent(x)', & '', & ' elemental integer function exponent(x)', & '', & ' real(kind=**),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X shall be of type real of any valid kind', & '', & ' o the result is a default integer type', & '', & 'DESCRIPTION', & ' EXPONENT(3) returns the value of the exponent part of X, provided the', & ' exponent is within the range of default integers.', & '', & 'OPTIONS', & ' o X : the value to query the exponent of', & '', & 'RESULT', & ' EXPONENT(3) returns the value of the exponent part of X', & '', & ' If X is zero the value returned is zero.', & '', & ' If X is an IEEE infinity or NaN, the result has the value HUGE(0).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_exponent', & ' implicit none', & ' real :: x = 1.0', & ' integer :: i', & ' i = exponent(x)', & ' print *, i', & ' print *, exponent(0.0)', & ' print *, exponent([10.0,100.0,1000.0,-10000.0])', & ' ! beware of overflow, it may occur silently', & ' !print *, 2**[10.0,100.0,1000.0,-10000.0]', & ' print *, exponent(huge(0.0))', & ' print *, exponent(tiny(0.0))', & ' end program demo_exponent', & '', & ' Results:', & '', & ' > 4 7 10 14', & ' > 128', & ' > -125', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), FRACTION(3), HUGE(3), MAXEXPONENT(3), MINEXPONENT(3),', & ' NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 exponent(3fortran)', & ''] shortname="exponent" call process() case('104','extends_type_of') textblock=[character(len=256) :: & '', & 'extends_type_of(3fortran) extends_type_of(3fortran)', & '', & 'NAME', & ' EXTENDS_TYPE_OF(3) - [STATE:INQUIRY] Determine if the dynamic type of A is', & ' an extension of the dynamic type of MOLD.', & '', & 'SYNOPSIS', & ' result = extends_type_of(a, mold)', & '', & ' logical extends_type_of(a, mold)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: a', & ' type(TYPE(kind=KIND)),intent(in) :: mold', & '', & 'CHARACTERISTICS', & ' -A shall be an object or pointer to an extensible declared type, or', & ' unlimited polymorphic. If it is a polymorphic pointer, it shall not have an', & ' undefined association status. -MOLE shall be an object or pointer to an', & ' extensible declared type or unlimited polymorphic. If it is a polymorphic', & ' pointer, it shall not have an undefined association status.', & '', & ' o the result is a scalar default logical type.', & '', & 'DESCRIPTION', & ' EXTENDS_TYPE_OF(3) is .true. if and only if the dynamic type of A is or', & ' could be (for unlimited polymorphic) an extension of the dynamic type of', & ' MOLD.', & '', & ' NOTE1', & '', & ' The dynamic type of a disassociated pointer or unallocated allocatable', & ' variable is its declared type.', & '', & ' NOTE2', & '', & ' The test performed by EXTENDS_TYPE_OF is not the same as the test performed', & ' by the type guard CLASS IS. The test performed by EXTENDS_TYPE_OF does not', & ' consider kind type parameters.', & '', & 'OPTIONS', & ' o A : be an object of extensible declared type or unlimited polymorphic. If', & ' it is a polymorphic pointer, it shall not have an undefined association', & ' status.', & '', & ' o MOLD : be an object of extensible declared type or unlimited polymorphic.', & ' If it is a polymorphic pointer, it shall not have an undefined', & ' association status.', & '', & 'RESULT', & ' If MOLD is unlimited polymorphic and is either a disassociated pointer or', & ' unallocated allocatable variable, the result is true.', & '', & ' Otherwise if A is unlimited polymorphic and is either a disassociated', & ' pointer or unallocated allocatable variable, the result is false.', & '', & ' Otherwise the result is true if and only if the dynamic type of A', & '', & ' if the dynamic type of A or MOLD is extensible, the result is true if and', & ' only if the dynamic type of A is an extension type of the dynamic type of', & ' MOLD; otherwise the result is processor dependent.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' ! program demo_extends_type_of', & ' module M_demo_extends_type_of', & ' implicit none', & ' private', & '', & ' type nothing', & ' end type nothing', & '', & ' type, extends(nothing) :: dot', & ' real :: x=0', & ' real :: y=0', & ' end type dot', & '', & ' type, extends(dot) :: point', & ' real :: z=0', & ' end type point', & '', & ' type something_else', & ' end type something_else', & '', & ' public :: nothing', & ' public :: dot', & ' public :: point', & ' public :: something_else', & '', & ' end module M_demo_extends_type_of', & '', & ' program demo_extends_type_of', & ' use M_demo_extends_type_of, only : nothing, dot, point, something_else', & ' implicit none', & ' type(nothing) :: grandpa', & ' type(dot) :: dad', & ' type(point) :: me', & ' type(something_else) :: alien', & '', & ' write(*,*)''these should all be true''', & ' write(*,*)extends_type_of(me,grandpa),''I am descended from Grandpa''', & ' write(*,*)extends_type_of(dad,grandpa),''Dad is descended from Grandpa''', & ' write(*,*)extends_type_of(me,dad),''Dad is my ancestor''', & '', & ' write(*,*)''is an object an extension of itself?''', & ' write(*,*)extends_type_of(grandpa,grandpa) ,''self-propagating!''', & ' write(*,*)extends_type_of(dad,dad) ,''clone!''', & '', & ' write(*,*)'' you did not father your grandfather''', & ' write(*,*)extends_type_of(grandpa,dad),''no paradox here''', & '', & ' write(*,*)extends_type_of(dad,me),''no paradox here''', & ' write(*,*)extends_type_of(grandpa,me),''no relation whatsoever''', & ' write(*,*)extends_type_of(grandpa,alien),''no relation''', & ' write(*,*)extends_type_of(me,alien),''not what everyone thinks''', & '', & ' call pointers()', & ' contains', & '', & ' subroutine pointers()', & ' ! Given the declarations and assignments', & ' type t1', & ' real c', & ' end type', & ' type, extends(t1) :: t2', & ' end type', & ' class(t1), pointer :: p, q', & ' allocate (p)', & ' allocate (t2 :: q)', & ' ! the result of EXTENDS_TYPE_OF (P, Q) will be false, and the result', & ' ! of EXTENDS_TYPE_OF (Q, P) will be true.', & ' write(*,*)''(P,Q)'',extends_type_of(p,q),"mind your P''s and Q''s"', & ' write(*,*)''(Q,P)'',extends_type_of(q,p)', & ' end subroutine pointers', & '', & ' end program demo_extends_type_of', & '', & ' Results:', & '', & ' > these should all be true', & ' > T I am descended from Grandpa', & ' > T Dad is descended from Grandpa', & ' > T Dad is my ancestor', & ' > is an object an extension of itself?', & ' > T self-propagating!', & ' > T clone!', & ' > you did not father your grandfather', & ' > F no paradox here', & ' > F no paradox here', & ' > F no relation whatsoever', & ' > F no relation', & ' > F not what everyone thinks', & ' > (P,Q) F mind your P''s and Q''s', & ' > (Q,P) T', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' SAME_TYPE_AS(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 extends_type_of(3fortran)', & ''] shortname="extends_type_of" call process() case('105','findloc') textblock=[character(len=256) :: & '', & 'findloc(3fortran) findloc(3fortran)', & '', & 'NAME', & ' FINDLOC(3) - [ARRAY:LOCATION] Location of first element of ARRAY identified', & ' by MASK along dimension DIM matching a target value', & '', & 'SYNOPSIS', & ' Syntax:', & '', & ' result = findloc (array, value, dim [,mask] [,kind] [,back])', & ' or', & ' result = findloc (array, value [,mask] [,kind] [,back])', & '', & ' function findloc (array, value, dim, mask, kind, back)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: array(..)', & ' type(TYPE(kind=KIND)),intent(in) :: value', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & ' integer(kind=**),intent(in),optional :: kind', & ' logical(kind=**),intent(in),optional :: back', & '', & 'CHARACTERISTICS', & ' o ARRAY is an array of any intrinsic type.', & '', & ' o VALUE shall be scalar but in type conformance with ARRAY, as specified', & ' for the operator == or the operator .EQV..', & '', & ' o DIM an integer corresponding to a dimension of ARRAY. The corresponding', & ' actual argument shall not be an optional dummy argument.', & '', & ' o MASK is logical and shall be conformable with ARRAY.', & '', & ' o KIND a scalar integer initialization expression (ie. a constant)', & '', & ' o BACK a logical scalar.', & '', & ' o the result is integer of default kind or kind KIND if the KIND argument', & ' is present. If DIM does not appear, the result is an array of rank one', & ' and of size equal to the rank of ARRAY; otherwise, the result is an array', & ' of the same rank and shape as ARRAY reduced by the dimension DIM.', & '', & ' NOTE: a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' FINDLOC(3) returns the location of the first element of ARRAY identified by', & ' MASK along dimension DIM having a value equal to VALUE.', & '', & ' If both ARRAY and VALUE are of type logical, the comparison is performed', & ' with the .EQV. operator; otherwise, the comparison is performed with the ==', & ' operator. If the value of the comparison is .true., that element of ARRAY', & ' matches VALUE.', & '', & ' If only one element matches VALUE, that element''s subscripts are returned.', & ' Otherwise, if more than one element matches VALUE and BACK is absent or', & ' present with the value .false., the element whose subscripts are returned is', & ' the first such element, taken in array element order. If BACK is present', & ' with the value .true., the element whose subscripts are returned is the last', & ' such element, taken in array element order.', & '', & 'OPTIONS', & ' o ARRAY : shall be an array of intrinsic type.', & '', & ' o VALUE : shall be scalar and in type conformance with ARRAY.', & '', & ' o DIM : shall be an integer scalar with a value in the range 1 <= DIM <= n,', & ' where n is the rank of ARRAY. The corresponding actual argument shall not', & ' be an optional dummy argument.', & '', & ' o MASK : (optional) shall be of type logical and shall be conformable with', & ' ARRAY.', & '', & ' o KIND : (optional) shall be a scalar integer initialization expression.', & '', & ' o BACK : (optional) shall be a logical scalar.', & '', & 'RESULT', & ' KIND is present, the kind type parameter is that specified by the value of', & ' KIND; otherwise the kind type parameter is that of default integer type. If', & ' DIM does not appear, the result is an array of rank one and of size equal to', & ' the rank of ARRAY; otherwise, the result is of rank n - 1 and shape', & '', & ' [d1, d2, . . ., dDIM-1, dDIM+1, . . ., dn ]', & '', & ' where', & '', & ' [d1, d2, . . ., dn ]', & '', & ' is the shape of ARRAY.', & '', & 'RESULT', & ' o CASE (I): The result of FINDLOC (ARRAY, VALUE) is a rank-one array whose', & ' element values are the values of the subscripts of an element of ARRAY', & ' whose value matches VALUE. If there is such a value, the ith subscript', & ' returned lies in the range 1 to ei, where ei is the extent of the ith', & ' dimension of ARRAY. If no elements match VALUE or ARRAY has size zero,', & ' all elements of the result are zero.', & '', & ' o CASE (II): the result of FINDLOC (ARRAY, VALUE, MASK = MASK) is a rank-', & ' one array whose element values are the values of the subscripts of an', & ' element of ARRAY, corresponding to a true element of MASK, whose value', & ' matches VALUE. If there is such a value, the ith subscript returned lies', & ' in the range 1 to ei, where ei is the extent of the ith dimension of', & ' ARRAY. If no elements match VALUE, ARRAY has size zero, or every element', & ' of MASK has the value false, all elements of the result are zero.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_findloc', & ' logical,parameter :: T=.true., F=.false.', & ' integer,allocatable :: ibox(:,:)', & ' logical,allocatable :: mask(:,:)', & ' ! basics', & ' ! the first element matching the value is returned AS AN ARRAY', & ' call printi(''== 6'',findloc ([2, 6, 4, 6], value = 6))', & ' call printi(''== 6'',findloc ([2, 6, 4, 6], value = 6,back=.true.))', & ' ! the first element matching the value is returned AS A SCALAR', & ' call printi(''== 6'',findloc ([2, 6, 4, 6], value = 6,dim=1))', & ' call printi(''== 6'',findloc ([2, 6, 4, 6], value = 6,back=.true.,dim=1))', & '', & ' ibox=reshape([ 0,-5, 7, 7, &', & ' 3, 4, -1, 2, &', & ' 1, 5, 6, 7] ,shape=[3,4],order=[2,1])', & '', & ' mask=reshape([ T, T, F, T, &', & ' T, T, F, T, &', & ' T, T, F, T] ,shape=[3,4],order=[2,1])', & '', & ' call printi(''array is'', ibox )', & ' call printl(''mask is'', mask )', & ' print *, ''so for == 7 and back=.false.''', & ' call printi(''so for == 7 the address of the element is'', &', & ' & findloc (ibox, 7, mask = mask) )', & ' print *, ''so for == 7 and back=.true.''', & ' call printi(''so for == 7 the address of the element is'', &', & ' & findloc (ibox, 7, mask = mask, back=.true.) )', & '', & ' print *,''This is independent of declared lower bounds for the array''', & '', & ' print *, '' using dim=N''', & ' ibox=reshape([ 1, 2, -9, &', & ' 2, 2, 6 ] ,shape=[2,3],order=[2,1])', & '', & ' call printi(''array is'', ibox )', & ' ! has the value [2, 1, 0] and', & ' call printi('''',findloc (ibox, value = 2, dim = 1) )', & ' ! has the value [2, 1].', & ' call printi('''',findloc (ibox, value = 2, dim = 2) )', & ' contains', & ' ! GENERIC ROUTINES TO PRINT MATRICES', & ' subroutine printl(title,a)', & ' implicit none', & ' !@(#) print small 2d logical scalar, vector, matrix in row-column format', & ' character(len=*),intent(in) :: title', & ' logical,intent(in) :: a(..)', & '', & ' character(len=*),parameter :: row=''(" > [ ",*(l1:,","))''', & ' character(len=*),parameter :: all=''(" ",*(g0,1x))''', & ' logical,allocatable :: b(:,:)', & ' integer :: i', & ' write(*,all,advance=''no'')trim(title)', & ' ! copy everything to a matrix to keep code simple', & ' select rank(a)', & ' rank (0); write(*,''(a)'')'' (a scalar)''; b=reshape([a],[1,1])', & ' rank (1); write(*,''(a)'')'' (a vector)''; b=reshape(a,[size(a),1])', & ' rank (2); write(*,''(a)'')'' (a matrix)''; b=a', & ' rank default; stop ''*printl* unexpected rank''', & ' end select', & ' do i=1,size(b,dim=1)', & ' write(*,fmt=row,advance=''no'')b(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & ' write(*,all) ''>shape='',shape(a),'',rank='',rank(a),'',size='',size(a)', & ' write(*,*)', & ' end subroutine printl', & '', & ' subroutine printi(title,a)', & ' implicit none', & ' !@(#) print small 2d integer scalar, vector, matrix in row-column format', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: a(..)', & ' character(len=*),parameter :: all=''(" ",*(g0,1x))''', & ' character(len=20) :: row', & ' integer,allocatable :: b(:,:)', & ' integer :: i', & ' write(*,all,advance=''no'')trim(title)', & ' ! copy everything to a matrix to keep code simple', & ' select rank(a)', & ' rank (0); write(*,''(a)'')'' (a scalar)''; b=reshape([a],[1,1])', & ' rank (1); write(*,''(a)'')'' (a vector)''; b=reshape(a,[size(a),1])', & ' rank (2); write(*,''(a)'')'' (a matrix)''; b=a', & ' rank default; stop ''*printi* unexpected rank''', & ' end select', & ' ! find how many characters to use for integers', & ' write(row,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(b))))))+2', & ' ! use this format to write a row', & ' row=''(" > [",*(i''//trim(row)//'':,","))''', & ' do i=1,size(b,dim=1)', & ' write(*,fmt=row,advance=''no'')b(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & ' write(*,all) ''>shape='',shape(a),'',rank='',rank(a),'',size='',size(a)', & ' write(*,*)', & ' end subroutine printi', & ' end program demo_findloc', & '', & ' Results:', & '', & ' > == 6 (a vector)', & ' > > [ 2 ]', & ' > >shape= 1 ,rank= 1 ,size= 1', & ' >', & ' > == 6 (a vector)', & ' > > [ 4 ]', & ' > >shape= 1 ,rank= 1 ,size= 1', & ' >', & ' > == 6 (a scalar)', & ' > > [ 2 ]', & ' > >shape= ,rank= 0 ,size= 1', & ' >', & ' > == 6 (a scalar)', & ' > > [ 4 ]', & ' > >shape= ,rank= 0 ,size= 1', & ' >', & ' > array is (a matrix)', & ' > > [ 0, -5, 7, 7 ]', & ' > > [ 3, 4, -1, 2 ]', & ' > > [ 1, 5, 6, 7 ]', & ' > >shape= 3 4 ,rank= 2 ,size= 12', & ' >', & ' > mask is (a matrix)', & ' > > [ T,T,F,T ]', & ' > > [ T,T,F,T ]', & ' > > [ T,T,F,T ]', & ' > >shape= 3 4 ,rank= 2 ,size= 12', & ' >', & ' > so for == 7 and back=.false.', & ' > so for == 7 the address of the element is (a vector)', & ' > > [ 1 ]', & ' > > [ 4 ]', & ' > >shape= 2 ,rank= 1 ,size= 2', & ' >', & ' > so for == 7 and back=.true.', & ' > so for == 7 the address of the element is (a vector)', & ' > > [ 3 ]', & ' > > [ 4 ]', & ' > >shape= 2 ,rank= 1 ,size= 2', & ' >', & ' > This is independent of declared lower bounds for the array', & ' > using dim=N', & ' > array is (a matrix)', & ' > > [ 1, 2, -9 ]', & ' > > [ 2, 2, 6 ]', & ' > >shape= 2 3 ,rank= 2 ,size= 6', & ' >', & ' > (a vector)', & ' > > [ 2 ]', & ' > > [ 1 ]', & ' > > [ 0 ]', & ' > >shape= 3 ,rank= 1 ,size= 3', & ' >', & ' > (a vector)', & ' > > [ 2 ]', & ' > > [ 1 ]', & ' > >shape= 2 ,rank= 1 ,size= 2', & ' >', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o MAXLOC(3) - Location of the maximum value within an array', & '', & ' o MINLOC(3) - Location of the minimum value within an array', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 findloc(3fortran)', & ''] shortname="findloc" call process() case('106','floor') textblock=[character(len=256) :: & '', & 'floor(3fortran) floor(3fortran)', & '', & 'NAME', & ' FLOOR(3) - [NUMERIC] Function to return largest integral value not greater', & ' than argument', & '', & 'SYNOPSIS', & ' result = floor(a [,kind])', & '', & ' elemental integer(kind=KIND) function floor( a ,kind )', & '', & ' real(kind=**),intent(in) :: a', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o A is a real of any kind', & '', & ' o KIND is any valid value for type integer.', & '', & ' o the result is an integer of the specified or default kind', & '', & 'DESCRIPTION', & ' FLOOR(3) returns the greatest integer less than or equal to A.', & '', & ' In other words, it picks the whole number at or to the left of the value on', & ' the number line.', & '', & ' This means care has to be taken that the magnitude of the real value A does', & ' not exceed the range of the output value, as the range of values supported', & ' by real values is typically larger than the range for integers.', & '', & 'OPTIONS', & ' o A : The value to operate on. Valid values are restricted by the size of', & ' the returned integer kind to the range -HUGE(INT(A,KIND=KIND))-1 to', & ' HUGE(INT(A),KIND=KIND).', & '', & ' o KIND : A scalar integer constant initialization expression indicating the', & ' kind parameter of the result.', & '', & 'RESULT', & ' The return value is of type integer(kind) if KIND is present and of default-', & ' kind integer otherwise.', & '', & ' The result is undefined if it cannot be represented in the specified integer', & ' type.', & '', & ' If in range for the kind of the result the result is the whole number at or', & ' to the left of the input value on the number line.', & '', & ' If A is positive the result is the value with the fractional part removed.', & '', & ' If A is negative, it is the whole number at or to the left of the input', & ' value.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_floor', & ' implicit none', & ' real :: x = 63.29', & ' real :: y = -63.59', & ' print *, x, floor(x)', & ' print *, y, floor(y)', & ' ! elemental', & ' print *,floor([ &', & ' & -2.7, -2.5, -2.2, -2.0, -1.5, -1.0, -0.5, &', & ' & 0.0, &', & ' & +0.5, +1.0, +1.5, +2.0, +2.2, +2.5, +2.7 ])', & '', & ' ! note even a small deviation from the whole number changes the result', & ' print *, [2.0,2.0-epsilon(0.0),2.0-2*epsilon(0.0)]', & ' print *,floor([2.0,2.0-epsilon(0.0),2.0-2*epsilon(0.0)])', & '', & ' ! A=Nan, Infinity or huge(0_KIND)-1 < A > huge(0_KIND) is undefined', & ' end program demo_floor', & '', & ' Results:', & '', & ' > 63.29000 63', & ' > -63.59000 -64', & ' > -3 -3 -3 -2 -2 -1', & ' > -1 0 0 1 1 2', & ' > 2 2 2', & ' > 2.000000 2.000000 2.000000', & ' > 2 1 1', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' CEILING(3), NINT(3), AINT(3), ANINT(3), INT(3), SELECTED_INT_KIND(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 floor(3fortran)', & ''] shortname="floor" call process() case('107','flush') textblock=[character(len=256) :: & '', & 'flush(7fortran) flush(7fortran)', & '', & 'NAME', & ' flush(7f) - [IO] flush I/O buffers of specified files', & '', & 'SYNOPSIS', & ' flush file-unit-number', & ' flush([UNIT=]file_unit_number,[iostat=i],[iomsg=str],[err=label_number])', & '', & 'DESCRIPTION', & ' I/O statements can buffer output before delivering it to the host system in', & ' order to minimize the overhead of system calls. Use FLUSH(7F) to deliver any', & ' such pending I/O for the identified file to the host system.', & '', & ' This is generally not required accept to ensure critical information is', & ' displayed or written as reliably as possible or to synchronise data from', & ' different units going to the same device. Do not arbitrarily flush all I/O', & ' operations or programs using large amounts of I/O might experience', & ' significant performance degradation, particularly if the I/O is to a block-', & ' oriented device.', & '', & ' Note execution of a FLUSH(7F) statement performs a wait operation for all', & ' pending asynchronous data transfer operations for the specified unit.', & '', & ' More generally execution of a FLUSH(7F) statement causes data written to an', & ' external file not only to be available to other processes, causes data', & ' placed in an external file by means other than Fortran to be available to a', & ' READ(7F) statement; but these actions are processor dependent.', & '', & ' Execution of a FLUSH(7F) statement for a file that is connected but does not', & ' exist is permitted and has no effect on any file.', & '', & ' A FLUSH(7F) statement has no effect on file position.', & '', & 'OPTIONS', & ' UNIT : A file-unit-number is required; if the optional characters "UNIT="', & ' are omitted, the unit-number must be the first item in the FLUSH(7)', & ' statement.', & '', & 'RETURNS', & ' IOSTAT : status variable. It is set to a processor-dependent positive value', & ' if an error occurs, to zero if the flush operation was successful, or to a', & ' processor-dependent negative value if the flush operation is not supported', & ' for the unit specified. IOMSG : character variable holding error description', & ' when iostat is not zero. ERR : The numeric line label of a target statement', & ' in the same scope as the FLUSH(7F) statement.', & '', & ' NOTE From the Fortran standard:', & '', & ' Because the Fortran standard does not specify the mechanism of file', & ' storage, the exact meaning of the flush operation is not precisely', & ' defined. It is expected that the flush operation will make all data', & ' written to a file available to other processes or devices, or make data', & ' recently added to a file by other processes or devices available to', & ' the program via a subsequent read operation. This is commonly called', & ' flushing input/output buffers.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_flush', & ' use, intrinsic :: iso_fortran_env, only : &', & ' & stderr=>ERROR_UNIT, &', & ' & stdin=>INPUT_UNIT, &', & ' & stdout=>OUTPUT_UNIT', & ' implicit none', & ' integer :: iostat', & ' character(len=255) :: iomsg', & ' flush (stderr, iostat=iostat, iomsg=iomsg)', & ' if(iostat.ne.0)then', & ' write(*,*)''ERROR:''//trim(iomsg)', & ' error stop 1', & ' endif', & ' flush (stdout, err = 999 )', & ' stop', & ' 999 continue', & ' stop 10', & ' end program demo_flush', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 flush(7fortran)', & ''] shortname="flush" call process() case('108','fraction') textblock=[character(len=256) :: & '', & 'fraction(3fortran) fraction(3fortran)', & '', & 'NAME', & ' FRACTION(3) - [MODEL:COMPONENTS] Fractional part of the model representation', & '', & 'SYNOPSIS', & ' result = fraction(x)', & '', & ' elemental real(kind=KIND) function fraction(x)', & '', & ' real(kind=KIND),intent(in) :: fraction', & '', & 'CHARACTERISTICS', & ' o X is of type real', & '', & ' o The result has the same characteristics as the argument.', & '', & 'DESCRIPTION', & ' FRACTION(3) returns the fractional part of the model representation of X.', & '', & 'OPTIONS', & ' o X : The value to interrogate', & '', & 'RESULT', & ' The fractional part of the model representation of X is returned; it is', & '', & ' x * real(radix(x))**(-exponent(x))', & '', & ' If X has the value zero, the result is zero.', & '', & ' If X is an IEEE NaN, the result is that NaN.', & '', & ' If X is an IEEE infinity, the result is an IEEE NaN.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_fraction', & ' implicit none', & ' real :: x', & ' x = 178.1387e-4', & ' print *, fraction(x), x * real(radix(x))**(-exponent(x))', & ' x = 10.0', & ' print *, fraction(x)', & ' print *, fraction(x) * 2**4', & ' end program demo_fraction', & '', & ' Results:', & '', & ' > 0.570043862 0.570043862', & ' > 0.625000000', & ' > 10.0000000', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), HUGE(3), MAXEXPONENT(3), MINEXPONENT(3),', & ' NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 fraction(3fortran)', & ''] shortname="fraction" call process() case('109','gamma') textblock=[character(len=256) :: & '', & 'gamma(3fortran) gamma(3fortran)', & '', & 'NAME', & ' GAMMA(3) - [MATHEMATICS] Gamma function, which yields factorials for', & ' positive whole numbers', & '', & 'SYNOPSIS', & ' result = gamma(x)', & '', & ' elemental real(kind=**) function gamma( x)', & '', & ' type(real,kind=**),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is a real value of any available KIND', & '', & ' o returns a real value with the same kind as X.', & '', & 'DESCRIPTION', & ' GAMMA(X) computes Gamma of X. For positive whole number values of N the', & ' Gamma function can be used to calculate factorials, as (N-1)! ==', & ' GAMMA(REAL(N)). That is', & '', & ' n! == gamma(real(n+1))', & '', & ' $$ \GAMMA(x) = \int_0**\infty t**{x-1}{\mathrm{e}}**{-T}\,{\mathrm{d}}t $$', & '', & 'OPTIONS', & ' o X : Shall be of type real and neither zero nor a negative integer.', & '', & 'RESULT', & ' The return value is of type real of the same kind as x. The result has a', & ' value equal to a processor-dependent approximation to the gamma function of', & ' X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_gamma', & ' use, intrinsic :: iso_fortran_env, only : wp=>real64, int64', & ' implicit none', & ' real :: x, xa(4)', & ' integer :: i, j', & '', & ' ! basic usage', & ' x = gamma(1.0)', & ' write(*,*)''gamma(1.0)='',x', & '', & ' ! elemental', & ' xa=gamma([1.0,2.0,3.0,4.0])', & ' write(*,*)xa', & ' write(*,*)', & '', & ' ! gamma() is related to the factorial function', & ' do i = 1, 171', & ' ! check value is not too big for default integer type', & ' if (factorial(i) <= huge(0)) then', & ' write(*,*) i, nint(factorial(i)), ''integer''', & ' elseif (factorial(i) <= huge(0_int64)) then', & ' write(*,*) i, nint(factorial(i),kind=int64),''integer(kind=int64)''', & ' else', & ' write(*,*) i, factorial(i) , ''user factorial function''', & ' write(*,*) i, product([(real(j, kind=wp), j=1, i)]), ''product''', & ' write(*,*) i, gamma(real(i + 1, kind=wp)), ''gamma directly''', & ' endif', & ' enddo', & '', & ' contains', & ' function factorial(i) result(f)', & ' ! GAMMA(X) computes Gamma of X. For positive whole number values of N the', & ' ! Gamma function can be used to calculate factorials, as (N-1)! ==', & ' ! GAMMA(REAL(N)). That is', & ' !', & ' ! n! == gamma(real(n+1))', & ' !', & ' integer, intent(in) :: i', & ' real(kind=wp) :: f', & ' if (i <= 0) then', & ' write(*,''(*(g0))'') ''<ERROR> gamma(3) function value '', i, '' <= 0''', & ' stop ''<STOP> bad value in gamma function''', & ' endif', & ' f = anint(gamma(real(i + 1,kind=wp)))', & ' end function factorial', & '', & ' end program demo_gamma', & '', & ' Results:', & '', & ' > gamma(1.0)= 1.00000000', & ' > 1.00000000 1.00000000 2.00000000 6.00000000', & ' >', & ' > 1 1 integer', & ' > 2 2 integer', & ' > 3 6 integer', & ' > 4 24 integer', & ' > 5 120 integer', & ' > 6 720 integer', & ' > 7 5040 integer', & ' > 8 40320 integer', & ' > 9 362880 integer', & ' > 10 3628800 integer', & ' > 11 39916800 integer', & ' > 12 479001600 integer', & ' > 13 6227020800 integer(kind=int64)', & ' > 14 87178291200 integer(kind=int64)', & ' > 15 1307674368000 integer(kind=int64)', & ' > 16 20922789888000 integer(kind=int64)', & ' > 17 355687428096000 integer(kind=int64)', & ' > 18 6402373705728001 integer(kind=int64)', & ' > 19 121645100408832000 integer(kind=int64)', & ' > 20 2432902008176640000 integer(kind=int64)', & ' > 21 5.1090942171709440E+019 user factorial function', & ' > 21 5.1090942171709440E+019 product', & ' > 21 5.1090942171709440E+019 gamma directly', & ' > :', & ' > :', & ' > :', & ' > 170 7.2574156153079990E+306 user factorial function', & ' > 170 7.2574156153079940E+306 product', & ' > 170 7.2574156153079990E+306 gamma directly', & ' > 171 Infinity user factorial function', & ' > 171 Infinity product', & ' > 171 Infinity gamma directly', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' Logarithm of the Gamma function: LOG_GAMMA(3)', & '', & 'RESOURCES', & ' Wikipedia: Gamma_function', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 gamma(3fortran)', & ''] shortname="gamma" call process() case('110','get_command') textblock=[character(len=256) :: & '', & 'get_command(3fortran) get_command(3fortran)', & '', & 'NAME', & ' GET_COMMAND(3) - [SYSTEM:COMMAND LINE] Get the entire command line', & ' invocation', & '', & 'SYNOPSIS', & ' call get_command([command] [,length] [,status] [,errmsg])', & '', & ' subroutine get_command( command ,length ,status, errmsg )', & '', & ' character(len=*),intent(out),optional :: command', & ' integer(kind=**),intent(out),optional :: length', & ' integer(kind=**),intent(out),optional :: status', & ' character(len=*),intent(inout),optional :: errmsg', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type meeting', & ' the conditions described herein.', & '', & ' o COMMAND and ERRMSG are scalar character variables of default kind.', & '', & ' o LENGTH and STATUS are scalar integer with a decimal exponent range of at', & ' least four.', & '', & 'DESCRIPTION', & ' GET_COMMAND(3) retrieves the entire command line that was used to invoke the', & ' program.', & '', & ' Note that what is typed on the command line is often processed by a shell.', & ' The shell typically processes special characters and white space before', & ' passing it to the program. The processing can typically be turned off by', & ' turning off globbing or quoting the command line arguments and/or changing', & ' the default field separators, but this should rarely be necessary.', & '', & 'RESULT', & ' o COMMAND : If COMMAND is present, the entire command line that was used to', & ' invoke the program is stored into it. If the command cannot be', & ' determined, COMMAND is assigned all blanks.', & '', & ' o LENGTH : If LENGTH is present, it is assigned the length of the command', & ' line. It is system-dependent as to whether trailing blanks will be', & ' counted. : If the command length cannot be determined, a length of 0 is', & ' assigned.', & '', & ' o STATUS : If STATUS is present, it is assigned 0 upon success of the', & ' command, -1 if COMMAND is too short to store the command line, or a', & ' positive value in case of an error.', & '', & ' o ERRMSG : It is assigned a processor-dependent explanatory message if the', & ' command retrieval fails. Otherwise, it is unchanged.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_get_command', & ' implicit none', & ' integer :: command_line_length', & ' character(len=:),allocatable :: command_line', & ' ! get command line length', & ' call get_command(length=command_line_length)', & ' ! allocate string big enough to hold command line', & ' allocate(character(len=command_line_length) :: command_line)', & ' ! get command line as a string', & ' call get_command(command=command_line)', & ' ! trim leading spaces just in case', & ' command_line=adjustl(command_line)', & ' write(*,''("OUTPUT:",a)'')command_line', & ' end program demo_get_command', & '', & ' Results:', & '', & ' # note that shell expansion removes some of the whitespace', & ' # without quotes', & ' ./test_get_command arguments on command line to echo', & '', & ' OUTPUT:./test_get_command arguments on command line to echo', & '', & ' # using the bash shell with single quotes', & ' ./test_get_command ''arguments *><`~[]!{}?"\''| ''', & '', & ' OUTPUT:./test_get_command arguments *><`~[]!{}?"''|', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' GET_COMMAND_ARGUMENT(3), COMMAND_ARGUMENT_COUNT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 get_command(3fortran)', & ''] shortname="get_command" call process() case('111','get_command_argument') textblock=[character(len=256) :: & '', & 'get_command_argument(3fortran) get_command_argument(3fortran)', & '', & 'NAME', & ' GET_COMMAND_ARGUMENT(3) - [SYSTEM:COMMAND LINE] Get command line arguments', & '', & 'SYNOPSIS', & ' call get_command_argument(number [,value] [,length] & & [,status] [,errmsg])', & '', & ' subroutine get_command_argument( number, value, length, &', & ' & status ,errmsg)', & '', & ' integer(kind=**),intent(in) :: number', & ' character(len=*),intent(out),optional :: value', & ' integer(kind=**),intent(out),optional :: length', & ' integer(kind=**),intent(out),optional :: status', & ' character(len=*),intent(inout),optional :: errmsg', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type meeting', & ' the conditions described herein.', & '', & ' o NUMBER, LENGTH, and STATUS are scalar integer with a decimal exponent', & ' range of at least four.', & '', & ' o VALUE and ERRMSG are scalar character variables of default kind.', & '', & 'DESCRIPTION', & ' GET_COMMAND_ARGUMENT(3) retrieves or queries the n-th argument that was', & ' passed on the command line to the current program execution.', & '', & ' There is not anything specifically stated about what an argument is but in', & ' practice the arguments are strings split on whitespace unless the arguments', & ' are quoted. IFS values (Internal Field Separators) used by common shells are', & ' typically ignored and unquoted whitespace is almost always the separator.', & '', & ' Shells have often expanded command arguments and spell characters before', & ' passing them to the program, so the strings read are often not exactly what', & ' the user typed on the command line.', & '', & 'OPTIONS', & ' o NUMBER : is a non-negative number indicating which argument of the', & ' current program command line is to be retrieved or queried. : If NUMBER =', & ' 0, the argument pointed to is set to the name of the program (on systems', & ' that support this feature). : if the processor does not have such a', & ' concept as a command name the value of command argument 0 is processor', & ' dependent. : For values from 1 to the number of arguments passed to the', & ' program a value is returned in an order determined by the processor.', & ' Conventionally they are returned consecutively as they appear on the', & ' command line from left to right.', & '', & 'RESULT', & ' o VALUE : The VALUE argument holds the command line argument. If VALUE can', & ' not hold the argument, it is truncated to fit the length of VALUE. : If', & ' there are less than NUMBER arguments specified at the command line or if', & ' the argument specified does not exist for other reasons, VALUE will be', & ' filled with blanks.', & '', & ' o LENGTH : The LENGTH argument contains the length of the n-th command line', & ' argument. The length of VALUE has no effect on this value, It is the', & ' length required to hold all the significant characters of the argument', & ' regardless of how much storage is provided by VALUE.', & '', & ' o STATUS : If the argument retrieval fails, STATUS is a positive number; if', & ' VALUE contains a truncated command line argument, STATUS is -1; and', & ' otherwise the STATUS is zero.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_get_command_argument', & ' implicit none', & ' character(len=255) :: progname', & ' integer :: count, i, argument_length, istat', & ' character(len=:),allocatable :: arg', & '', & ' ! command name assuming it is less than 255 characters in length', & ' call get_command_argument (0, progname, status=istat)', & ' if (istat == 0) then', & ' print *, "The program''s name is " // trim (progname)', & ' else', & ' print *, "Could not get the program''s name " // trim (progname)', & ' endif', & '', & ' ! get number of arguments', & ' count = command_argument_count()', & ' write(*,*)''The number of arguments is '',count', & '', & ' !', & ' ! allocate string array big enough to hold command line', & ' ! argument strings and related information', & ' !', & ' do i=1,count', & ' call get_command_argument(number=i,length=argument_length)', & ' if(allocated(arg))deallocate(arg)', & ' allocate(character(len=argument_length) :: arg)', & ' call get_command_argument(i, arg,status=istat)', & ' ! show the results', & ' write (*,''(i3.3,1x,i0.5,1x,i0.5,1x,"[",a,"]")'') &', & ' & i,istat,argument_length,arg', & ' enddo', & '', & ' end program demo_get_command_argument', & '', & ' Results:', & '', & ' ./demo_get_command_argument a test ''of getting arguments '' " leading"', & '', & ' > The program''s name is ./demo_get_command_argument', & ' > The number of arguments is 4', & ' >001 00000 00001 [a]', & ' >002 00000 00004 [test]', & ' >003 00000 00022 [of getting arguments ]', & ' >004 00000 00008 [ leading]', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' GET_COMMAND(3), COMMAND_ARGUMENT_COUNT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 get_command_argument(3fortran)', & ''] shortname="get_command_argument" call process() case('112','get_environment_variable') textblock=[character(len=256) :: & '', & 'get_environment_variable(3fortran) get_environment_variable(3fortran)', & '', & 'NAME', & ' GET_ENVIRONMENT_VARIABLE(3) - [SYSTEM:ENVIRONMENT] Retrieve the value of an', & ' environment variable', & '', & 'SYNOPSIS', & ' call get_environment_variable(name [,value] [,length] & & [,status]', & ' [,trim_name] [,errmsg] )', & '', & ' subroutine character(len=*) get_environment_variable( &', & ' & name, value, length, status, trim_name, errmsg )', & '', & ' character(len=*),intent(in) :: name', & ' character(len=*),intent(out),optional :: value', & ' integer(kind=**),intent(out),optional :: length', & ' integer(kind=**),intent(out),optional :: status', & ' logical,intent(out),optional :: trim_name', & ' character(len=*),intent(inout),optional :: errmsg', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type meeting', & ' the conditions described herein.', & '', & ' o NAME, VALUE, and ERRMSG are a scalar character of default kind.', & '', & ' o LENGTH and STATUS are integer scalars with a decimal exponent range of at', & ' least four.', & '', & ' o TRIM_NAME is a scalar of type logical and of default kind.', & '', & 'DESCRIPTION', & ' GET_ENVIRONMENT_VARIABLE(3) retrieves the VALUE of the environment variable', & ' NAME.', & '', & ' Note that GET_ENVIRONMENT_VARIABLE(3) need not be thread-safe. It is the', & ' responsibility of the user to ensure that the environment is not being', & ' updated concurrently.', & '', & ' When running in parallel be aware it is processor dependent whether an', & ' environment variable that exists on an image also exists on another image,', & ' and if it does exist on both images whether the values are the same or', & ' different.', & '', & 'OPTIONS', & ' o NAME : The name of the environment variable to query. The interpretation', & ' of case is processor dependent.', & '', & 'RESULT', & ' o VALUE : The value of the environment variable being queried. If VALUE is', & ' not large enough to hold the data, it is truncated. If the variable NAME', & ' is not set or has no value, or the processor does not support environment', & ' variables VALUE will be filled with blanks.', & '', & ' o LENGTH : This argument contains the length needed to store the', & ' environment variable name. It is zero if the environment variable is not', & ' set.', & '', & ' o STATUS : Returns', & '', & ' o -1 if value is present but too short to fit in the provided variable.', & '', & ' o 1 if the environment variable does not exist', & '', & ' o 2 if the processor does not support environment variables', & '', & ' o and 0 in all other cases.', & '', & ' o TRIM_NAME : If present and set to .false. the trailing blanks in name are', & ' significant; otherwise, they are not considered part of the environment', & ' variable name.', & '', & ' o ERRMSG : is assigned a processor-dependent explanatory message if the', & ' optional argument STATUS is, or would be if present, assigned a positive', & ' value. Otherwise, it is unchanged.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_getenv', & ' implicit none', & ' character(len=:),allocatable :: homedir', & ' character(len=:),allocatable :: var', & '', & ' var=''HOME''', & ' homedir=get_env(var)', & ' write (*,''(a,"=""",a,"""")'')var,homedir', & '', & ' contains', & '', & ' function get_env(name,default) result(value)', & ' ! a function that makes calling get_environment_variable(3) simple', & ' use, intrinsic :: iso_fortran_env, only : stderr=>ERROR_UNIT', & ' implicit none', & ' character(len=*),intent(in) :: name', & ' character(len=*),intent(in),optional :: default', & ' character(len=:),allocatable :: value', & ' integer :: howbig', & ' integer :: stat', & ' integer :: length', & ' length=0', & ' value=''''', & ' if(name.ne.'''')then', & ' call get_environment_variable( name, &', & ' & length=howbig,status=stat,trim_name=.true.)', & ' select case (stat)', & ' case (1)', & ' write(stderr,*) &', & ' & name, " is not defined in the environment. Strange..."', & ' value=''''', & ' case (2)', & ' write(stderr,*) &', & ' & "This processor does not support environment variables. Boooh!"', & ' value=''''', & ' case default', & ' ! make string of sufficient size to hold value', & ' if(allocated(value))deallocate(value)', & ' allocate(character(len=max(howbig,1)) :: value)', & ' ! get value', & ' call get_environment_variable( &', & ' & name,value,status=stat,trim_name=.true.)', & ' if(stat.ne.0)value=''''', & ' end select', & ' endif', & ' if(value.eq.''''.and.present(default))value=default', & ' end function get_env', & '', & ' end program demo_getenv', & '', & ' Typical Results:', & '', & ' > HOME="/home/urbanjs"', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' GET_COMMAND_ARGUMENT(3), GET_COMMAND(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 20get_environment_variable(3fortran)', & ''] shortname="get_environment_variable" call process() case('113','huge') textblock=[character(len=256) :: & '', & 'huge(3fortran) huge(3fortran)', & '', & 'NAME', & ' HUGE(3) - [MODEL:NUMERIC] Largest number of a type and kind', & '', & 'SYNOPSIS', & ' result = huge(x)', & '', & ' TYPE(kind=KIND) function huge(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x(..)', & '', & 'CHARACTERISTICS', & ' o X may be any real or integer scalar or array and any kind.', & '', & ' o The result will be a scalar of the same type and kind as the input X', & '', & 'DESCRIPTION', & ' HUGE(3) returns the largest number that is not an overflow for the kind and', & ' type of X.', & '', & 'OPTIONS', & ' o X : X is an arbitrary value which is used merely to determine what kind', & ' and type of scalar is being queried. It need not be defined, as only its', & ' characteristics are used.', & '', & 'RESULT', & ' The result is the largest value supported by the specified type and kind.', & '', & ' Note the result is as the same kind as the input to ensure the returned', & ' value does not overflow. Any assignment of the result to a variable requires', & ' the variable must be able to hold the value as well. For example:', & '', & ' real :: r', & ' r=huge(0.0d0)', & '', & ' where R is single-precision would almost certainly result in overflow.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_huge', & ' implicit none', & ' character(len=*),parameter :: f=''(i2,1x,2(i11,1x),f14.0:,1x,l1,1x,a)''', & ' integer :: i, j, k, biggest', & ' real :: v, w', & ' doubleprecision :: tally', & ' ! basic', & ' print *, huge(0), huge(0.0), huge(0.0d0)', & ' print *, tiny(0.0), tiny(0.0d0)', & '', & ' tally=0.0d0', & ' ! note subtracting one because counter is the end value+1 on exit', & ' do i=0,huge(0)-1', & ' tally=tally+i', & ' enddo', & ' write(*,*)''tally='',tally', & '', & ' ! advanced', & ' biggest=huge(0)', & ' ! be careful of overflow when using integers in computation', & ' do i=1,14', & ' j=6**i ! Danger, Danger', & ' w=6**i ! Danger, Danger', & ' v=6.0**i', & ' k=v ! Danger, Danger', & '', & ' if(v.gt.biggest)then', & ' write(*,f) i, j, k, v, v.eq.w, ''wrong j and k and w''', & ' else', & ' write(*,f) i, j, k, v, v.eq.w', & ' endif', & ' enddo', & ' ! a simple check of the product of two 32-bit integers', & ' print *,checkprod([2,4,5,8],[10000,20000,3000000,400000000])', & '', & ' contains', & ' impure elemental function checkprod(i,j) result(ij32)', & ' ! checkprod(3f) - check for overflow when multiplying 32-bit integers', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' integer(kind=int32),intent(in) :: i, j', & ' integer(kind=int64) :: ij64', & ' integer(kind=int32) :: ij32', & ' integer,parameter :: toobig=huge(0_int32)', & ' character(len=80) :: message', & ' ij64=int(i,kind=int64)*int(j,kind=int64)', & ' if(ij64.gt.toobig)then', & ' write(message,''(*(g0))'')&', & ' & ''<ERROR>checkprod(3f):'',i,''*'',j,''='',ij64,''>'',toobig', & ' stop message', & ' else', & ' ij32=ij64', & ' endif', & ' end function checkprod', & ' end program demo_huge', & '', & ' Results:', & '', & ' > 2147483647 3.40282347E+38 1.7976931348623157E+308', & ' > 1.17549435E-38 2.2250738585072014E-308', & ' > tally= 2.3058430049858406E+018', & ' > 1 6 6 6. T', & ' > 2 36 36 36. T', & ' > 3 216 216 216. T', & ' > 4 1296 1296 1296. T', & ' > 5 7776 7776 7776. T', & ' > 6 46656 46656 46656. T', & ' > 7 279936 279936 279936. T', & ' > 8 1679616 1679616 1679616. T', & ' > 9 10077696 10077696 10077696. T', & ' > 10 60466176 60466176 60466176. T', & ' > 11 362797056 362797056 362797056. T', & ' > 12 -2118184960 -2147483648 2176782336. F wrong j and k and w', & ' > 13 175792128 -2147483648 13060694016. F wrong j and k and w', & ' > 14 1054752768 -2147483648 78364164096. F wrong j and k and w', & ' > STOP <ERROR>checkprod(3f):8*400000000=3200000000>2147483647', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3),', & ' SCALE(3), SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 huge(3fortran)', & ''] shortname="huge" call process() case('114','hypot') textblock=[character(len=256) :: & '', & 'hypot(3fortran) hypot(3fortran)', & '', & 'NAME', & ' HYPOT(3) - [MATHEMATICS] Returns the Euclidean distance - the distance', & ' between a point and the origin.', & '', & 'SYNOPSIS', & ' result = hypot(x, y)', & '', & ' elemental real(kind=KIND) function hypot(x,y)', & '', & ' real(kind=KIND),intent(in) :: x', & ' real(kind=KIND),intent(in) :: y', & '', & 'CHARACTERISTICS', & ' o X,Y and the result shall all be real and of the same KIND.', & '', & 'DESCRIPTION', & ' In mathematics, the Euclidean distance between two points in Euclidean space', & ' is the length of a line segment between two points.', & '', & ' HYPOT(X,Y) returns the special case of the Euclidean distance between the', & ' point <X,Y> and the origin. It is equal to', & '', & ' sqrt(x**2+y**2)', & '', & ' without undue underflow or overflow.', & '', & 'OPTIONS', & ' o X : the x value of the point of interest', & '', & ' o Y : the y value of the point of interest', & '', & 'RESULT', & ' The result is the positive magnitude of the distance of the point <X,Y> from', & ' the origin <0.0,0.0> .', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_hypot', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real32) :: x, y', & ' real(kind=real32),allocatable :: xs(:), ys(:)', & ' integer :: i', & ' character(len=*),parameter :: f=''(a,/,SP,*(3x,g0,1x,g0:,/))''', & '', & ' x = 1.e0_real32', & ' y = 0.5e0_real32', & '', & ' write(*,*)', & ' write(*,''(*(g0))'')''point <'',x,'','',y,''> is '',hypot(x,y)', & ' write(*,''(*(g0))'')''units away from the origin''', & ' write(*,*)', & '', & ' ! elemental', & ' xs=[ x, x**2, x*10.0, x*15.0, -x**2 ]', & ' ys=[ y, y**2, -y*20.0, y**2, -y**2 ]', & '', & ' write(*,f)"the points",(xs(i),ys(i),i=1,size(xs))', & ' write(*,f)"have distances from the origin of ",hypot(xs,ys)', & ' write(*,f)"the closest is",minval(hypot(xs,ys))', & '', & ' end program demo_hypot', & '', & ' Results:', & '', & ' >', & ' > point <1.00000000,0.500000000> is 1.11803401', & ' > units away from the origin', & ' >', & ' > the points', & ' > +1.00000000 +0.500000000', & ' > +1.00000000 +0.250000000', & ' > +10.0000000 -10.0000000', & ' > +15.0000000 +0.250000000', & ' > -1.00000000 -0.250000000', & ' > have distances from the origin of', & ' > +1.11803401 +1.03077638', & ' > +14.1421356 +15.0020828', & ' > +1.03077638', & ' > the closest is', & ' > +1.03077638', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' o exp(3) - Base-e exponential function', & '', & ' o gamma(3) - Gamma function, which yields factorials for positive whole', & ' numbers', & '', & ' o log(3) - Natural logarithm', & '', & ' o log10(3) - Base 10 or common logarithm', & '', & ' o log_gamma(3) - Logarithm of the absolute value of the Gamma function', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 hypot(3fortran)', & ''] shortname="hypot" call process() case('115','iachar') textblock=[character(len=256) :: & '', & 'iachar(3fortran) iachar(3fortran)', & '', & 'NAME', & ' IACHAR(3) - [CHARACTER:CONVERSION] Return integer ASCII code of a character', & '', & 'SYNOPSIS', & ' result = iachar(c [,kind])', & '', & ' elemental integer(kind=KIND) function iachar(c,kind)', & '', & ' character(len=1),intent(in) :: c', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o C is a single character', & '', & ' o The return value is of type integer and of kind KIND. If KIND is absent,', & ' the return value is of default integer kind.', & '', & ' NOTE: : a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' IACHAR(3) returns the code for the ASCII character in the first character', & ' position of C.', & '', & 'OPTIONS', & ' o C : A character to determine the ASCII code of. A common extension is to', & ' allow strings but all but the first character is then ignored.', & '', & ' o KIND : A constant initialization expression indicating the kind parameter', & ' of the result.', & '', & 'RESULT', & ' the result is the position of the character C in the ASCII collating', & ' sequence. It is nonnegative and less than or equal to 127.', & '', & ' By ASCII, it is meant that C is in the collating sequence defined by the', & ' codes specified in ISO/IEC 646:1991 (International Reference Version).', & '', & ' The value of the result is processor dependent if C is not in the ASCII', & ' collating sequence.', & '', & ' The results are consistent with the LGE(3), LGT(3), LLE(3), and LLT(3)', & ' comparison functions. For example, if LLE(C, D) is true, IACHAR(C) <= IACHAR', & ' (D) is true where C and D are any two characters representable by the', & ' processor.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_iachar', & ' implicit none', & ' ! basic usage', & ' ! just does a string one character long', & ' write(*,*)iachar(''A'')', & ' ! elemental: can do an array of letters', & ' write(*,*)iachar([''A'',''Z'',''a'',''z''])', & '', & ' ! convert all characters to lowercase', & ' write(*,''(a)'')lower(''abcdefg ABCDEFG'')', & ' contains', & ' !', & ' pure elemental function lower(str) result (string)', & ' ! Changes a string to lowercase', & ' character(*), intent(In) :: str', & ' character(len(str)) :: string', & ' integer :: i', & ' string = str', & ' ! step thru each letter in the string in specified range', & ' do i = 1, len(str)', & ' select case (str(i:i))', & ' case (''A'':''Z'') ! change letter to miniscule', & ' string(i:i) = char(iachar(str(i:i))+32)', & ' case default', & ' end select', & ' end do', & ' end function lower', & ' !', & ' end program demo_iachar', & '', & ' Results:', & '', & ' > 65', & ' > 65 90 97 122', & ' > abcdefg abcdefg', & '', & 'STANDARD', & ' Fortran 95 , with KIND argument - Fortran 2003', & '', & 'SEE ALSO', & ' ACHAR(3), CHAR(3), ICHAR(3)', & '', & ' See ICHAR(3) in particular for a discussion of converting between numerical', & ' values and formatted string representations.', & '', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 iachar(3fortran)', & ''] shortname="iachar" call process() case('116','iall') textblock=[character(len=256) :: & '', & 'iall(3fortran) iall(3fortran)', & '', & 'NAME', & ' IALL(3) - [BIT:LOGICAL] Bitwise and of array elements', & '', & 'SYNOPSIS', & ' result = iall(array [,mask]) | iall(array ,dim [,mask])', & '', & ' integer(kind=KIND) function iall(array,dim,mask)', & '', & ' integer(kind=KIND),intent(in) :: array(*)', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(*)', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o ARRAY must be an integer array', & '', & ' o MASK is a logical array that conforms to ARRAY of any logical kind.', & '', & ' o DIM may be of any integer kind.', & '', & ' o The result will by of the same type and kind as ARRAY.', & '', & 'DESCRIPTION', & ' IALL(3) reduces with a bitwise and the elements of ARRAY along dimension DIM', & ' if the corresponding element in MASK is .true..', & '', & 'OPTIONS', & ' o ARRAY : Shall be an array of type integer', & '', & ' o DIM : (Optional) shall be a scalar of type integer with a value in the', & ' range from 1 TO N, where N equals the rank of ARRAY.', & '', & ' o MASK : (Optional) shall be of type logical and either be a scalar or an', & ' array of the same shape as ARRAY.', & '', & 'RESULT', & ' The result is of the same type as ARRAY.', & '', & ' If DIM is absent, a scalar with the bitwise all of all elements in ARRAY is', & ' returned. Otherwise, an array of rank N-1, where N equals the rank of ARRAY,', & ' and a shape similar to that of ARRAY with dimension DIM dropped is returned.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_iall', & ' use, intrinsic :: iso_fortran_env, only : integer_kinds, &', & ' & int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int8) :: a(2)', & '', & ' a(1) = int(b''00100100'')', & ' a(2) = int(b''01101010'')', & '', & ' print ''(b8.8)'', iall(a)', & '', & ' end program demo_iall', & '', & ' Results:', & '', & ' > 00100000', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' IANY(3), IPARITY(3), IAND(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 iall(3fortran)', & ''] shortname="iall" call process() case('117','iand') textblock=[character(len=256) :: & '', & 'iand(3fortran) iand(3fortran)', & '', & 'NAME', & ' IAND(3) - [BIT:LOGICAL] Bitwise logical AND', & '', & 'SYNOPSIS', & ' result = iand(i, j)', & '', & ' elemental integer(kind=KIND) function iand(i,j)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=KIND),intent(in) :: j', & '', & 'CHARACTERISTICS', & ' o I, J and the result shall have the same integer type and kind, with the', & ' exception that one of I or J may be a BOZ constant.', & '', & 'DESCRIPTION', & ' IAND(3) returns the bitwise logical AND of two values.', & '', & 'OPTIONS', & ' o I : one of the pair of values to compare the bits of', & '', & ' o J : one of the pair of values to compare the bits of', & '', & ' If either I or J is a BOZ-literal-constant, it is first converted as if by', & ' the intrinsic function INT(3) to type integer with the kind type parameter', & ' of the other.', & '', & 'RESULT', & ' The result has the value obtained by combining I and I bit-by-bit according', & ' to the following table:', & '', & ' I | J | IAND (I, J)', & ' ----------------------------', & '', & ' 1 | 1 | 1', & '', & ' 1 | 0 | 0', & '', & ' 0 | 1 | 0', & '', & ' 0 | 0 | 0', & '', & ' So if both the bit in I and J are on the resulting bit is on (a one); else', & ' the resulting bit is off (a zero).', & '', & ' This is commonly called the "bitwise logical AND" of the two values.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_iand', & ' implicit none', & ' integer :: a, b', & ' data a / z''f'' /, b / z''3'' /', & ' write (*,*) ''a='',a,'' b='',b,''iand(a,b)='',iand(a, b)', & ' write (*,''(b32.32)'') a,b,iand(a,b)', & ' end program demo_iand', & '', & ' Results:', & '', & ' > a= 15 b= 3 iand(a,b)= 3', & ' > 00000000000000000000000000001111', & ' > 00000000000000000000000000000011', & ' > 00000000000000000000000000000011', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' BTEST(3), IBCLR(3), IBITS(3), IBSET(3), IEOR(3), IOR(3), MVBITS(3), NOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 iand(3fortran)', & ''] shortname="iand" call process() case('118','iany') textblock=[character(len=256) :: & '', & 'iany(3fortran) iany(3fortran)', & '', & 'NAME', & ' IANY(3) - [BIT:LOGICAL] Bitwise OR of array elements', & '', & 'SYNOPSIS', & ' result = iany(array [,mask]) | iany(array ,dim [,mask])', & '', & ' integer(kind=KIND) function iany(array,dim,mask)', & '', & ' integer(kind=KIND),intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & '', & 'CHARACTERISTICS', & ' o ARRAY is an integer array', & '', & ' o DIM may be of any integer kind.', & '', & ' o MASK is a logical array that conforms to ARRAY', & '', & ' o The result will by of the same type and kind as ARRAY. It is scalar if', & ' DIM does not appear or is 1. Otherwise, it is the shape and rank of array', & ' reduced by the dimension DIM.', & '', & ' note a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' IANY(3) reduces with bitwise OR (inclusive OR) the elements of ARRAY along', & ' dimension DIM if the corresponding element in MASK is .true..', & '', & 'OPTIONS', & ' o ARRAY : an array of elements to selectively OR based on the mask.', & '', & ' o DIM : a value in the range from 1 TO N, where N equals the rank of ARRAY.', & '', & ' o MASK : a logical scalar; or an array of the same shape as ARRAY.', & '', & 'RESULT', & ' The result is of the same type as ARRAY.', & '', & ' If DIM is absent, a scalar with the bitwise or of all elements in ARRAY is', & ' returned. Otherwise, an array of rank N-1, where N equals the rank of ARRAY,', & ' and a shape similar to that of ARRAY with dimension DIM dropped is returned.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_iany', & ' use, intrinsic :: iso_fortran_env, only : integer_kinds, &', & ' & int8, int16, int32, int64', & ' implicit none', & ' logical,parameter :: T=.true., F=.false.', & ' integer(kind=int8) :: a(3)', & ' a(1) = int(b''00100100'',int8)', & ' a(2) = int(b''01101010'',int8)', & ' a(3) = int(b''10101010'',int8)', & ' write(*,*)''A=''', & ' print ''(1x,b8.8)'', a', & ' print *', & ' write(*,*)''IANY(A)=''', & ' print ''(1x,b8.8)'', iany(a)', & ' print *', & ' write(*,*)''IANY(A) with a mask''', & ' print ''(1x,b8.8)'', iany(a,mask=[T,F,T])', & ' print *', & ' write(*,*)''should match ''', & ' print ''(1x,b8.8)'', iany([a(1),a(3)])', & ' print *', & ' write(*,*)''does it?''', & ' write(*,*)iany(a,[T,F,T]) == iany([a(1),a(3)])', & ' end program demo_iany', & '', & ' Results:', & '', & ' > A=', & ' > 00100100', & ' > 01101010', & ' > 10101010', & ' >', & ' > IANY(A)=', & ' > 11101110', & ' >', & ' > IANY(A) with a mask', & ' > 10101110', & ' >', & ' > should match', & ' > 10101110', & ' >', & ' > does it?', & ' > T', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' IPARITY(3), IALL(3), IOR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 iany(3fortran)', & ''] shortname="iany" call process() case('119','ibclr') textblock=[character(len=256) :: & '', & 'ibclr(3fortran) ibclr(3fortran)', & '', & 'NAME', & ' IBCLR(3) - [BIT:SET] Clear a bit', & '', & 'SYNOPSIS', & ' result = ibclr(i, pos)', & '', & ' elemental integer(kind=KIND) function ibclr(i,pos)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=**),intent(in) :: pos', & '', & 'CHARACTERISTICS', & ' o I shall be type integer.', & '', & ' o POS shall be type integer.', & '', & ' o The return value is of the same kind as I.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' IBCLR(3) returns the value of I with the bit at position POS set to zero.', & '', & 'OPTIONS', & ' o I : The initial value to be modified', & '', & ' o POS : The position of the bit to change in the input value. A value of', & ' zero refers to the right-most bit. The value of POS must be nonnegative', & ' and less than (BIT_SIZE(I)).', & '', & 'RESULT', & ' The returned value has the same bit sequence as I except the designated bit', & ' is unconditionally set to 0', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ibclr', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int16) :: i', & ' ! basic usage', & ' print *,ibclr (16, 1), '' ==> ibclr(16,1) has the value 15''', & '', & ' ! it is easier to see using binary representation', & ' i=int(b''0000000000111111'',kind=int16)', & ' write(*,''(b16.16,1x,i0)'') ibclr(i,3), ibclr(i,3)', & '', & ' ! elemental', & ' print *,''an array of initial values may be given as well''', & ' print *,ibclr(i=[7,4096,9], pos=2)', & ' print *', & ' print *,''a list of positions results in multiple returned values''', & ' print *,''not multiple bits set in one value, as the routine is ''', & ' print *,''a scalar function; calling it elementally essentially ''', & ' print *,''calls it multiple times. ''', & ' write(*,''(b16.16)'') ibclr(i=-1_int16, pos=[1,2,3,4])', & '', & ' ! both may be arrays if of the same size', & '', & ' end program demo_ibclr', & '', & ' Results:', & '', & ' > 16 ==> ibclr(16,1) has the value 15', & ' > 0000000000110111 55', & ' > an array of initial values may be given as well', & ' > 3 4096 9', & ' >', & ' > a list of positions results in multiple returned values', & ' > not multiple bits set in one value, as the routine is', & ' > a scalar function; calling it elementally essentially', & ' > calls it multiple times.', & ' > 1111111111111101', & ' > 1111111111111011', & ' > 1111111111110111', & ' > 1111111111101111', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' BTEST(3), IAND(3), IBITS(3), IBSET(3), IEOR(3), IOR(3), MVBITS(3), NOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ibclr(3fortran)', & ''] shortname="ibclr" call process() case('120','ibits') textblock=[character(len=256) :: & '', & 'ibits(3fortran) ibits(3fortran)', & '', & 'NAME', & ' IBITS(3) - [BIT:COPY] Extraction of a subset of bits', & '', & 'SYNOPSIS', & ' result = ibits(i, pos, len)', & '', & ' elemental integer(kind=KIND) function ibits(i,pos,len)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=**),intent(in) :: pos', & ' integer(kind=**),intent(in) :: len', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported integer kind', & '', & ' o I may be any supported integer kind as well', & '', & ' o the return value will be the same kind as I', & '', & 'DESCRIPTION', & ' IBITS(3) extracts a field of bits from I, starting from bit position POS and', & ' extending left for a total of LEN bits.', & '', & ' The result is then right-justified and the remaining left-most bits in the', & ' result are zeroed.', & '', & ' The position POS is calculated assuming the right-most bit is zero and the', & ' positions increment to the left.', & '', & 'OPTIONS', & ' o I : The value to extract bits from', & '', & ' o POS : The position of the bit to start copying at. POS is non-negative.', & '', & ' o LEN : the number of bits to copy from I. It must be non-negative.', & '', & ' POS + LEN shall be less than or equal to BIT_SIZE(I).', & '', & 'RESULT', & ' The return value is composed of the selected bits right-justified, left-', & ' padded with zeros.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ibits', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int16) :: i,j', & ' ! basic usage', & ' print *,ibits (14, 1, 3) ! should be seven', & ' print *,ibits(-1,10,3) ! and so is this', & ' ! it is easier to see using binary representation', & ' i=int(b''0101010101011101'',kind=int16)', & ' write(*,''(b16.16,1x,i0)'') ibits(i,3,3), ibits(i,3,3)', & '', & ' ! we can illustrate this as', & ' ! #-- position 15', & ' ! | #-- position 0', & ' ! | <-- +len |', & ' ! V V', & ' ! 5432109876543210', & ' i =int(b''1111111111111111'',kind=int16)', & ' ! ^^^^', & ' j=ibits(i,10,4) ! start at 10th from left and proceed', & ' ! left for a total of 4 characters', & ' write(*,''(a,b16.16)'')''j='',j', & ' ! lets do something less ambiguous', & ' i =int(b''0010011000000000'',kind=int16)', & ' j=ibits(i,9,5)', & ' write(*,''(a,b16.16)'')''j='',j', & ' end program demo_ibits', & '', & ' Results:', & '', & ' > 7', & ' > 7', & ' > 0000000000000011 3', & ' > j=0000000000001111', & ' > j=0000000000010011', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' BTEST(3), IAND(3), IBCLR(3), IBSET(3), IEOR(3), IOR(3), MVBITS(3), NOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ibits(3fortran)', & ''] shortname="ibits" call process() case('121','ibset') textblock=[character(len=256) :: & '', & 'ibset(3fortran) ibset(3fortran)', & '', & 'NAME', & ' IBSET(3) - [BIT:SET] Set a bit to one in an integer value', & '', & 'SYNOPSIS', & ' result = ibset(i, pos)', & '', & ' elemental integer(kind=KIND) function ibset(i,pos)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=**),intent(in) :: pos', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o The return value is of the same kind as I. Otherwise, any integer kinds', & ' are allowed.', & '', & 'DESCRIPTION', & ' IBSET(3) returns the value of I with the bit at position POS set to one.', & '', & 'OPTIONS', & ' o I : The initial value to be modified', & '', & ' o POS : The position of the bit to change in the input value. A value of', & ' zero refers to the right-most bit. The value of POS must be nonnegative', & ' and less than (BIT_SIZE(I)).', & '', & 'RESULT', & ' The returned value has the same bit sequence as I except the designated bit', & ' is unconditionally set to 1.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ibset', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int16) :: i', & ' ! basic usage', & ' print *,ibset (12, 1), ''ibset(12,1) has the value 14''', & '', & ' ! it is easier to see using binary representation', & ' i=int(b''0000000000000110'',kind=int16)', & ' write(*,''(b16.16,1x,i0,1x,i0)'') ibset(i,12), ibset(i,12), i', & '', & ' ! elemental', & ' print *,''an array of initial values may be given as well''', & ' print *,ibset(i=[0,4096], pos=2)', & ' print *', & ' print *,''a list of positions results in multiple returned values''', & ' print *,''not multiple bits set in one value, as the routine is ''', & ' print *,''a scalar function; calling it elementally essentially ''', & ' print *,''calls it multiple times. ''', & ' write(*,''(b16.16)'') ibset(i=0, pos=[1,2,3,4])', & '', & ' ! both may be arrays if of the same size', & '', & ' end program demo_ibset', & '', & ' Results:', & '', & ' > 14 ibset(12,1) has the value 14', & ' > 0001000000000110 4102 6', & ' > an array of initial values may be given as well', & ' > 4 4100', & ' >', & ' > a list of positions results in multiple returned values', & ' > not multiple bits set in one value, as the routine is', & ' > a scalar function; calling it elementally essentially', & ' > calls it multiple times.', & ' > 0000000000000010', & ' > 0000000000000100', & ' > 0000000000001000', & ' > 0000000000010000', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' IBCLR(3)', & '', & ' BTEST(3), IAND(3), IBITS(3), IEOR(3), IOR(3), MVBITS(3), NOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ibset(3fortran)', & ''] shortname="ibset" call process() case('122','ichar') textblock=[character(len=256) :: & '', & 'ichar(3fortran) ichar(3fortran)', & '', & 'NAME', & ' ICHAR(3) - [CHARACTER:CONVERSION] Character-to-integer code conversion', & ' function', & '', & 'SYNOPSIS', & ' result = ichar(c [,kind])', & '', & ' elemental integer(kind=KIND) function ichar(c,KIND)', & '', & ' character(len=1,kind=**),intent(in) :: c', & ' integer,intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o C is a scalar character', & '', & ' o KIND is a constant integer initialization expression indicating the kind', & ' parameter of the result.', & '', & ' o The return value is of type integer and of kind KIND. If KIND is absent,', & ' the return value is of default integer kind.', & '', & 'DESCRIPTION', & ' ICHAR(3) returns the code for the character in the system''s native character', & ' set. The correspondence between characters and their codes is not', & ' necessarily the same across different Fortran implementations. For example,', & ' a platform using EBCDIC would return different values than an ASCII', & ' platform.', & '', & ' See IACHAR(3) for specifically working with the ASCII character set.', & '', & 'OPTIONS', & ' o C : The input character to determine the decimal code of. The range of', & ' values capable of representation is processor-dependent.', & '', & ' o KIND : indicates the kind parameter of the result. If KIND is absent, the', & ' return value is of default integer kind.', & '', & 'RESULT', & ' The code in the system default character set for the character being queried', & ' is returned.', & '', & ' The result is the position of C in the processor collating sequence', & ' associated with the kind type parameter of C.', & '', & ' it is nonnegative and less than n, where n is the number of characters in', & ' the collating sequence.', & '', & ' The kind type parameter of the result shall specify an integer kind that is', & ' capable of representing n.', & '', & ' For any characters C and D capable of representation in the processor, C <=', & ' D is true if and only if ICHAR (C) <= ICHAR (D) is true and C == D is true', & ' if and only if ICHAR (C) == ICHAR (D) is true.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ichar', & ' use,intrinsic :: iso_fortran_env, only : b=>int8', & ' implicit none', & ' integer,parameter :: bytes=80', & ' character :: string*(bytes),lets((bytes))*1', & ' integer(kind=b) :: ilets(bytes)', & ' equivalence (string,lets)', & ' equivalence (string,ilets)', & ' write(*,*)ichar([''a'',''z'',''A'',''Z''])', & ' string=''Do unto others''', & ' associate (a=>ichar(lets))', & ' ilets=merge(a-32,a,a>=97.and.a<=122) ! uppercase', & ' write(*,*)string', & ' ilets=merge(a+32,a,a>=65.and.a<=90) ! lowercase', & ' write(*,*)string', & ' end associate', & ' end program demo_ichar', & '', & ' Results:', & '', & ' > 97 122 65 90', & ' > DO UNTO OTHERS', & ' > do unto others', & '', & 'STANDARD', & ' Fortran 95, with KIND argument -Fortran 2003', & '', & 'SEE ALSO', & ' ACHAR(3), CHAR(3), IACHAR(3)', & '', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3),', & '', & ' SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ichar(3fortran)', & ''] shortname="ichar" call process() case('123','ieor') textblock=[character(len=256) :: & '', & 'ieor(3fortran) ieor(3fortran)', & '', & 'NAME', & ' IEOR(3) - [BIT:LOGICAL] Bitwise exclusive OR', & '', & 'SYNOPSIS', & ' result = ieor(i, j)', & '', & ' elemental integer(kind=**) function ieor(i,j)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in) :: j', & '', & 'CHARACTERISTICS', & ' o I, J and the result must be of the same integer kind.', & '', & ' o An exception is that one of I and J may be a BOZ literal constant', & '', & 'DESCRIPTION', & ' IEOR(3) returns a bitwise exclusive-OR of I and J.', & '', & ' An exclusive OR or "exclusive disjunction" is a logical operation that is', & ' true if and only if its arguments differ. In this case a one-bit and a zero-', & ' bit substitute for true and false.', & '', & ' This is often represented with the notation "XOR", for "eXclusive OR".', & '', & ' An alternate way to view the process is that the result has the value', & ' obtained by combining I and J bit-by-bit according to the following table:', & '', & ' > I | J |IEOR (I, J)', & ' > --#---#-----------', & ' > 1 | 1 | 0', & ' > 1 | 0 | 1', & ' > 0 | 1 | 1', & ' > 0 | 0 | 0', & '', & 'OPTIONS', & ' o I : the first of the two values to XOR', & '', & ' o J : the second of the two values to XOR', & '', & ' If either I or J is a boz-literal-constant, it is first converted as if by', & ' the intrinsic function INT to type integer with the kind type parameter of', & ' the other.', & '', & 'RESULT', & ' If a bit is different at the same location in I and J the corresponding bit', & ' in the result is 1, otherwise it is 0.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ieor', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int16) :: i,j', & ' ! basic usage', & ' print *,ieor (16, 1), '' ==> ieor(16,1) has the value 17''', & '', & ' ! it is easier to see using binary representation', & ' i=int(b''0000000000111111'',kind=int16)', & ' j=int(b''0000001111110000'',kind=int16)', & ' write(*,''(a,b16.16,1x,i0)'')''i= '',i, i', & ' write(*,''(a,b16.16,1x,i0)'')''j= '',j, j', & ' write(*,''(a,b16.16,1x,i0)'')''result='',ieor(i,j), ieor(i,j)', & '', & ' ! elemental', & ' print *,''arguments may be arrays. If both are arrays they ''', & ' print *,''must have the same shape. ''', & ' print *,ieor(i=[7,4096,9], j=2)', & '', & ' ! both may be arrays if of the same size', & '', & ' end program demo_ieor', & '', & ' Results:', & '', & ' > 17 ==> ieor(16,1) has the value 17', & ' > i= 0000000000111111 63', & ' > j= 0000001111110000 1008', & ' > result=0000001111001111 975', & ' > arguments may be arrays. If both are arrays they', & ' > must have the same shape.', & ' > 5 4098 11', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' BTEST(3), IAND(3), IBCLR(3), IBITS(3), IBSET(3), IEOR(3), IOR(3), MVBITS(3),', & ' NOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ieor(3fortran)', & ''] shortname="ieor" call process() case('124','if') textblock=[character(len=256) :: & '', & 'if(7fortran) if(7fortran)', & '', & 'NAME', & ' if(7f) - [EXECUTION CONTROL] selects a block based on a sequence of logical', & ' expressions.', & '', & 'SYNOPSIS', & ' Syntax:', & '', & ' [if_construct_name:] IF (scalar-logical-expr) THEN', & ' block', & ' ELSEIF (scalar-logical-expr) THEN [if_construct_name]', & ' block', & ' ELSE [if_construct_name]', & ' block', & ' ENDIF [if_construct_name]', & '', & ' or', & '', & ' IF (scalar-logical-expression) action-statement', & '', & 'DESCRIPTION', & ' The IF construct selects for execution at most one of its constituent', & ' blocks. The selection is based on a sequence of logical expressions.', & '', & ' If an if-construct-name is specified, both the IF and ENDIF must use that', & ' same name. If an ELSE or ELSEIF uses an if-construct-name it must be the', & ' same as the one specified on the corresponding IF/ENDIF.', & '', & 'EXECUTION OF AN IF CONSTRUCT', & ' If there is an ELSE statement in the construct it acts as a default if all', & ' the preceding conditionals on the IF or ELSEIF where false, ensuring exactly', & ' one of the blocks in the construct is executed. The scalar logical', & ' expressions are evaluated in the order of their appearance in the construct', & ' until a true value is found or an ELSE statement or ENDIF statement is', & ' encountered. IF an ELSE statement is found, the block immediately following', & ' is executed and this completes the execution of the construct. That is, an', & ' ELSE should follow any ELSEIF statements. The scalar logical expressions in', & ' any remaining ELSEIF statements of the IF construct are not evaluated. If', & ' none of the evaluated expressions is true and there is no ELSE statement,', & ' the execution of the construct is completed without the execution of any', & ' block within the construct.', & '', & ' It is permissible to branch to an ENDIF statement only from within its IF', & ' construct. Execution of an ENDIF statement has no effect.', & '', & 'STANDALONE IF', & ' The IF statement controls the execution of a single action statement based', & ' on a single logical expression.', & '', & ' The action-stmt in the if-stmt shall not be an end-function-stmt, end-mp-', & ' subprogram-stmt, end-program-stmt, end-subroutine-stmt, or if-stmt.', & '', & ' Execution of an IF statement causes evaluation of the scalar logical', & ' expression. If the value of the expression is true, the action statement is', & ' executed. If the value is false, the action statement is not executed and', & ' execution continues.', & '', & ' The execution of a function reference in the scalar logical expression may', & ' affect entities in the action statement. That is, if values are changed by', & ' the functions used in the logical expressions the selected block will use', & ' those values. It is generally a bad idea to use functions changing the', & ' values, but what would you expect this to produce?', & '', & ' Calling a function with side-effects on I;', & '', & ' program change', & ' i=1', & ' if(increment(i).gt.10)then', & ' write(*,*)''IF'',i', & ' elseif(increment(i).ge.20)then', & ' write(*,*)''ELSEIF'',i', & ' else', & ' write(*,*)''ELSE'',i', & ' endif', & ' contains', & ' function increment(i)', & ' write(*,*)''INC'',i', & ' increment=i*5', & ' i=i+3', & ' write(*,*)''INC'',i', & ' end function increment', & ' end program change', & '', & ' Result:', & '', & ' > INC 1', & ' > INC 4', & ' > INC 4', & ' > INC 7', & ' > ELSEIF 7', & '', & ' An example of an IF statement is:', & '', & ' IF (A > 0.0) A = LOG (A)', & '', & 'EXAMPLES', & ' Sample IF constructs:', & '', & ' program demo_if', & ' implicit none', & ' character(len=:),allocatable :: cvar', & ' logical :: PROP=.false.', & ' real :: a, b, c, d', & ' integer :: case=0', & ' integer :: i, j, k', & ' logical :: nextprop=.true.', & ' !', & ' ! basic IF', & ' !', & ' cvar=''NO''', & ' if (cvar == ''RESET'') then', & ' i = 0; j = 0; k = 0', & ' endif', & ' !', & ' ! labeled and nested IF constructs', & ' !', & ' OUTER: if (case.eq.0)then', & ' PROOF_DONE: if (PROP) then', & ' write (3, ''(''''QED'''')'')', & ' exit OUTER', & ' else', & ' PROP = nextprop', & ' endif PROOF_DONE', & ' write(*,*)''END OF PROOF_DONE''', & ' else OUTER', & ' write(*,*)''else outer''', & ' endif OUTER', & ' !', & ' ! if-elseif-endif', & ' !', & ' if (a > 0) then', & ' b = c/a', & ' if (b > 0) then', & ' d = 1.0', & ' endif', & ' elseif (c > 0) then', & ' b = a/c', & ' d = -1.0', & ' else', & ' b = abs (max (a, c))', & ' d = 0', & ' endif', & ' !', & ' end program demo_if', & '', & 'SEE ALSO', & ' o DO(3) - construct', & '', & ' o IF(3) - selects a block based on a sequence of logical expressions.', & '', & ' o CYCLE(3) - construct', & '', & ' o EXIT(3) - statement', & '', & ' o ASSOCIATE(3) - associate construct', & '', & ' o BLOCK(3) - construct', & '', & ' o GOTO(3) - jump to target line', & '', & ' o SELECT(3) - select a block based on the value of an expression (a case)', & '', & ' o CASE(3) - select a block based on the value of an expression (a case)', & '', & ' o ENDSELECT(3) - select a block based on the value of an expression (a', & ' case)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 if(7fortran)', & ''] shortname="if" call process() case('125','image_index') textblock=[character(len=256) :: & '', & 'image_index(3fortran) image_index(3fortran)', & '', & 'NAME', & ' IMAGE_INDEX(3) - [COLLECTIVE] Cosubscript to image index conversion', & '', & 'SYNOPSIS', & ' result = image_index(coarray, sub)', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' IMAGE_INDEX(3) returns the image index belonging to a cosubscript.', & '', & 'OPTIONS', & ' o COARRAY : Coarray of any type.', & '', & ' o SUB : default integer rank-1 array of a size equal to the corank of', & ' COARRAY.', & '', & 'RESULT', & ' Scalar default integer with the value of the image index which corresponds', & ' to the cosubscripts. For invalid cosubscripts the result is zero.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo image_index', & ' implicit none', & ' integer :: array[2,-1:4,8,*]', & ' ! Writes 28 (or 0 if there are fewer than 28 images)', & ' write (*,*) image_index(array, [2,0,3,1])', & ' end demo image_index', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' THIS_IMAGE(3), NUM_IMAGES(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 image_index(3fortran)', & ''] shortname="image_index" call process() case('126','implicit') textblock=[character(len=256) :: & '', & 'implicit(7fortran) implicit(7fortran)', & '', & 'NAME', & ' IMPLICIT(7f) - [STATEMENT] specify default type associated to a starting', & ' letter or disallow implicit typing', & '', & 'SYNOPSIS', & ' implicit [NONE]|[declaration-type-spec (letter-spec-list)]', & '', & 'DESCRIPTION', & ' Determine default mapping between the first letter of a data entity and a', & ' type. The default is the equivalent of the statement', & '', & ' implicit real(a-h,o-z),integer(i-n)', & '', & ' Compiler switches often allow the default to be the commonly recommended', & '', & ' implicit none ! require all variables to have type statements', & '', & ' This requires that the procedures be written using "strong typing"; where', & ' every variable subsequently has to be defined in a type declaration', & ' statement.', & '', & ' If implicit typing is turned off you do not need to know all the scoping', & ' rules for implicit typing, which by itself is a significant reason for', & ' turning it off.', & '', & ' When a large number of variable names are used with strong typing a', & ' significant number of lines of code need added to declare the variables; but', & ' strong typing is still almost universally recommended where terseness is not', & ' critical (as is sometimes the case in interactive usage or quick', & ' prototyping).', & '', & ' Every data entity has a type (INTEGER, REAL, CHARACTER, ...). If a type is', & ' not explicitly assigned to a variable or function it will (by default) be', & ' assigned one according to the following rule -- the type is INTEGER if the', & ' name starts with the letters from I to N (the first two letters of the word', & ' "integer"); otherwise it defaults to REAL.', & '', & ' The IMPLICIT statement allows the default rule to be changed or set to null.', & '', & ' To turn off implicit typing enter one and only one IMPLICIT statement in the', & ' scoping unit', & '', & ' implicit none ! Disable all implicit typing', & '', & ' Each data entity will now require having a type declared explicitly', & ' (INTEGER, REAL, DOUBLE, COMPLEX, ...).', & '', & ' The statement must appear after any USE statements and before any type', & ' declarations, including PARAMETER statements (which must know the rules to', & ' determine what type names are that have not been explicitly declared).', & '', & ' In most new code implicit typing is turned off either with an "IMPLICIT', & ' NONE" or sometimes by a compiler switch. On the other hand, the majority of', & ' pre-fortran90 code depends on implicit defaults.', & '', & ' Each prefix letter may have the type assigned to it declared only once in a', & ' unit.', & '', & ' As previously stated, the default rule, expressed as an IMPLICIT statement', & ' is', & '', & ' implicit real(a-h,o-z),integer(i-n)', & '', & ' To make the default for all names be a DOUBLEPRECISION type one could enter', & '', & ' implicit doubleprecision (a-z)', & '', & ' NOTE: The standard does not require constants to be affected, so a type', & ' suffix is required for most constants. That is, even if A is implicitly', & ' double-precision', & '', & ' A=123456789.01234 ! only retains the precision of a default REAL', & '', & ' A=123456789.01234D0 ! precision of a double will be retained', & '', & ' In another unit one might specify (multiple statements and compound', & ' statements are allowed, as illustrated):', & '', & ' implicit complex (c), doubleprecision (d)', & ' implicit integer (i)', & ' implicit logical (l)', & ' implicit real (r)', & ' implicit character(len=8) (a,b,e-h,j,k,m-q,s-z)', & '', & ' There is no way to make some letters default to no type and others have a', & ' default. Either nothing has a default type or everything does. You can', & ' however make a default be a user-defined null type.', & '', & ' subroutine sub1()', & ' ! cannot do a "implicit none" on just some letters.', & ' ! and a type is required so', & ' ! implicit (a-h) ! NOTE: NOT ALLOWED. TYPE IS REQUIRE0', & ' ! but you can make the default an user-defined type ...', & ' ! notice the (incidently empty) type is defined below', & ' ! the implicit statement', & ' implicit nil(a-h) ! or implicit type(nil) (a)', & ' !', & ' type nil', & ' end type nil', & ' type(nil) :: anull', & ' end subroutine sub1', & '', & ' The default for an internal or module procedure is the mapping in the host', & ' scoping unit. That is, a single "IMPLICIT NONE" in the global top section of', & ' a module makes the default be "IMPLICIT NONE" in any contained procedure.', & '', & ' Explicitly setting a variable type always overides the default so any data', & ' entity that is not explicitly declared by a type declaration statement, is', & ' not an intrinsic function, and is not accessed by use or host association is', & ' declared implicitly to be of the type (and type parameters) mapped from the', & ' first letter of its name, provided the mapping is not null. But anything', & ' accessed by a USE statement retains the type it had in the scoping unit in', & ' which it was declared.', & '', & ' This means the mapping may be to a derived type that is inaccessible in the', & ' local scope if the derived type is accessible in the host scoping unit. That', & ' is, if you import the variable "FRED" of type "GOO" from a module; "FRED" is', & ' of type "GOO" even if type "GOO" is private in the module defining "FRED".', & ' That is, variable "FRED" retains the type "GOO" even if you cannot declare', & ' variables of type "GOO" in the current scoping unit.', & '', & ' So the data entity is treated as if it were declared in an explicit type', & ' declaration in the outermost scoping unit in which it appears. An explicit', & ' type specification in a FUNCTION statement overrides an IMPLICIT statement', & ' for the name of the result variable of that function subprogram.', & '', & 'OPTIONS', & ' NONE', & ' Turns off implicit typing. Recommended. It must follow USE statements but', & ' be before any variable', & '', & ' declarations, including PARAMETER statements.', & ' When used there shall be no other IMPLICIT statements in the scoping', & ' unit.', & '', & ' TYPE() letter-spec', & ' is (letter-or-range[,letter-or-range] [,letter-or-range] ) If the minus', & ' and second letter appear, the second letter shall follow the first letter', & ' alphabetically. A letter-spec consisting of two letter s separated by a', & ' minus is equivalent to writing a list containing all of the letters in', & ' alphabetical order in the alphabetic sequence from the first letter', & ' through the second letter. For example, A-C is equivalent to A, B, C. The', & ' same letter shall not appear as a single letter, or be included in a range', & ' of letters, more than once in all of the IMPLICIT statements in a scoping', & ' unit.', & '', & 'EXAMPLE', & ' The following are examples of the use of IMPLICIT statements:', & '', & ' module example_module', & ' implicit none', & ' ...', & ' interface', & ' function fun (i) ! not all data entities need to', & ' integer fun ! be declared explicitly, so I', & ' end function fun ! does not need declared', & ' end interface', & ' contains', & ' function jfun (j) ! all data entities need to', & ' integer jfun, j ! be declared explicitly.', & ' ...', & ' end function jfun', & ' end module example_module', & '', & ' subroutine sub', & ' implicit complex (c)', & ' CM = (3.0, 2.0) ! CM is implicitly declared COMPLEX', & ' ...', & ' contains', & ' subroutine sub1', & ' IMPLICIT INTEGER (A, C)', & ' C = (0.0, 0.0) ! C is host associated and of', & ' ! type complex', & ' Z = 1.0 ! Z is implicitly declared REAL', & ' A = 2 ! A is implicitly declared INTEGER', & ' CC = 1 ! CC is implicitly declared INTEGER', & ' ...', & ' end subroutine sub1', & ' subroutine sub2', & ' Z = 2.0 ! Z is implicitly declared REAL and', & ' ! is different from the variable of', & ' ! the same name in SUB1', & ' ...', & ' end subroutine sub2', & ' subroutine sub3', & ' USE EXAMPLE_MODULE ! Accesses integer function FUN', & ' ! by use association', & ' Q = FUN (K) ! Q is implicitly declared REAL and', & ' ... ! K is implicitly declared INTEGER', & ' end subroutine sub3', & ' end subroutine sub', & '', & ' The following is an example of a mapping to a derived type that is', & ' inaccessible in the local scope:', & '', & ' program main', & ' implicit type(blob) (a)', & ' type blob', & ' integer :: i', & ' end type blob', & ' type(blob) :: b', & ' call steve', & ' contains', & ' subroutine steve', & ' integer :: blob', & ' !..', & ' aa = b', & ' !..', & ' end subroutine steve', & ' end program main', & '', & ' In the subroutine STEVE(), it is not possible to explicitly declare a', & ' variable to be of type BLOB because BLOB has been given a different meaning,', & ' but implicit mapping for the letter A still maps to type BLOB, so AA is of', & ' type BLOB.', & '', & ' program demo_implicit', & ' ! everything accessed via USE already has a type and comes', & ' ! before an implicit statement; but implicit rules are not', & ' ! inherited from modules', & ' use, intrinsic :: iso_fortran_env, only : stderr=>ERROR_UNIT', & ' !', & ' ! the implicit statement must come before other declarations', & ' ! in new code using this turns on strong typing (that is,every', & ' ! variable has to have its type declared in a statement). This', & ' ! is generally highly recommended for new code.', & ' implicit none', & ' ! it is still a convention used by many programmers to reserve', & ' ! starting letters of I to N for integers.', & ' integer :: i, j, k', & ' type(real) :: x,y,z', & ' intrinsic sin,cos ! intrinsic types are already specified', & ' integer,external :: zzz ! but external functions need declared', & ' ! if they do not have an interface', & ' call sub1()', & ' call sub2()', & ' contains', & ' subroutine sub1()', & ' ! the implicit none above became the default for contained', & ' ! procedures so no reason to repeat it. So only required once', & ' ! in main procedure or once in top of a module to change the', & ' ! default of all procedures defined after a CONTAINS statement', & ' integer :: i=10,j=20', & ' write(*,*)''I='',i,''J='',j', & ' end subroutine sub1', & ' subroutine sub2()', & ' ! a contained subroutine can override the default created in the', & ' ! containing scope though', & ' implicit complex(a-z)', & ' A=(10,20)', & ' write(*,*)''A='',a', & ' end subroutine sub2', & ' end', & ' integer function zzz()', & ' zzz=1234', & ' end function zzz', & ' !end program demo_implicit', & '', & ' Results:', & '', & ' > I= 10 J= 20', & ' > A= (10.0000000,20.0000000)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 implicit(7fortran)', & ''] shortname="implicit" call process() case('127','include') textblock=[character(len=256) :: & '', & 'include(7fortran) include(7fortran)', & '', & 'NAME', & ' include(7f) - [PREPROCESS] blending source text', & '', & 'SYNOPSIS', & ' INCLUDE char-literal-constant', & '', & 'DESCRIPTION', & ' Additional text may be incorporated into the source text of a program unit', & ' during processing. This is accomplished with the INCLUDE line, which', & ' typically has the form', & '', & ' INCLUDE "filename"', & '', & ' An INCLUDE line is not a Fortran statement. It is processed at compilation.', & ' The effect of the INCLUDE line is as if the referenced source text', & ' physically replaced the INCLUDE line prior to program processing. Included', & ' text may contain almost any source text, including additional INCLUDE lines;', & ' such nested INCLUDE lines are similarly replaced with the specified source', & ' text. The maximum depth of nesting of any nested INCLUDE lines is processor', & ' dependent. Inclusion of the source text referenced by an INCLUDE line shall', & ' not, at any level of nesting, result in inclusion of the same source text', & ' (ie. it cannot be recursive).', & '', & ' The exceptions on what can be included in an INCLUDE file are that the first', & ' included statement line cannot be a continuation line and the last included', & ' statement line cannot be continued.', & '', & ' The interpretation of char-literal-constant is processor dependent.', & '', & ' It is generally implemented as a filename containing text to be included,', & ' but could be interpreted as a URL or a system command that generates text or', & ' a database query, or a list of files, for example. That being said, all', & ' current implementations appear to at least treat it as a simple filename.', & '', & ' Where the compiler searches for the filename is implementation-dependent.', & ' All current implementations appear to at least search for the file in the', & ' same directory as the file containing the INCLUDE statement if it is not a', & ' complete filepath specification. It is common but not required that other', & ' directories are searched as specified with the common -I switch found on', & ' most compiler commands.', & '', & ' The char-literal-constant shall not have a kind type parameter value that is', & ' a named-constant. That is, it must be a quoted string. It cannot be', & ' something like', & '', & ' character(len=*),parameter :: filename=''willnotwork.inc''', & ' include filename', & '', & ' An INCLUDE line shall appear on a single source line where a statement may', & ' appear (many compilers support an extension allowing continuation lines to', & ' be supported); it must be the only nonblank text on the line other than an', & ' optional trailing comment (no statement label is allowed). So here are some', & ' bad ideas', & '', & ' INCLUDE "filename";I=10 ! NO: multiple statements on line', & ' 100 INCLUDE ''filename'' ! NO: statement label not allowed', & ' ! continuation often works but is non-standard', & ' INCLUDE &', & ' & ''filename''', & ' INCLUDE ''file&', & ' &name''', & '', & ' PREPROCESSING Note that an INCLUDE line is generally processed after any', & ' preprocessor so the INCLUDE file should not include preprocessor directives', & ' such as cpp(1) or fpp(1) directives. If that is required you probably need', & ' to use an equivalent preprocessor directive such as a cpp(1) "#include"', & ' directive instead of a Fortran INCLUDE.', & '', & ' SUMMARY So it is a de-facto standard that an INCLUDE at least supports a', & ' simple filename pointing to a file in the directory where the file', & ' containing the INCLUDE file resides or a full path name in single or double', & ' quotes.', & '', & ' An INCLUDE statement was a common way to ensure a COMMONBLOCK was declared', & ' the same in multiple files (at least if every file with the INCLUDE was', & ' recompiled). It should generally be avoided and a MODULE should be used', & ' instead of a COMMONBLOCK in the vast majority of cases in new code.', & '', & ' RULES FOR FIXED AND FREE FILE FORMAT PORTABILITY If the code in your', & ' "include file" needs read by both old fixed-format files and free-format', & ' files it is not necessary to maintain two copies of the file.', & '', & ' Observing the following rules allows included code to be used with either', & ' free or fixed source forms.', & '', & ' o Confine statement labels to character positions 1 to 5 and statements', & ' to character positions 7 to 72', & '', & ' o Treat blanks as being significant.', & '', & ' o Use only the exclamation mark (!) to indicate a comment, but do not', & ' start the comment in character position 6.', & '', & ' o For continued statements, place an ampersand (&) in both character', & ' position 73 of a continued line and character position 6 of a', & ' continuation line.', & '', & 'EXAMPLE', & ' Sample program:', & '', & ' In this example, the same code for the function subr is used to build a', & ' 32-bit and 64-bit version that are then merged into a generic name', & '', & ' Given the file "subr.inc":', & '', & ' function subr(val)', & ' ! trivial function. What to note is', & ' ! all the kinds are specified via "WP"', & ' real(kind=wp) :: subr', & ' real(kind=wp),intent(in) :: val', & ' subr=sqrt(val*3.0_wp)', & ' end function subr', & '', & ' and we will throw in a few other files to do simple includes with as well.', & '', & ' declarations.inc', & '', & ' integer :: i,j,k', & '', & ' somecode.inc', & '', & ' write(*,*)''Hello World!''', & '', & ' somemorecode.inc', & '', & ' subroutine another()', & ' write(*,*)''Hello World!''', & ' end subroutine another', & '', & ' !program show_include', & ' ! define wp to be single precision', & ' ! and include file', & ' module single', & ' integer,parameter :: wp=kind(0.0)', & ' contains', & ' include "subr.inc"', & ' end module single', & '', & ' module double', & ' ! define wp to be double precision', & ' ! and include file', & ' integer,parameter :: wp=kind(0.0d0)', & ' contains', & ' include "subr.inc"', & ' end module double', & '', & ' module merge', & ' ! so: module single contains a 32-bit subr() procedure', & ' ! while: module single contains a 64-bit subr() procedure', & ' ! make a generic subr() from the two versions', & ' use single, only : subs=>subr', & ' use double, only : subd=>subr', & ' interface subr', & ' module procedure subs', & ' module procedure subd', & ' end interface', & '', & ' end module merge', & '', & ' program show_include', & ' use merge, only : subr', & ' implicit none', & ' include "declarations.inc"', & ' write(*,*)''Hello World!''', & ' write(*,*)subr(10.0)', & ' write(*,*)subr(20.0d0)', & ' include "somecode.inc"', & ' contains', & ' include "somemorecode.inc"', & ' end program show_include', & '', & ' March 16, 2025 include(7fortran)', & ''] shortname="include" call process() case('128','index') textblock=[character(len=256) :: & '', & 'index(3fortran) index(3fortran)', & '', & 'NAME', & ' INDEX(3) - [CHARACTER:SEARCH] Position of a substring within a string', & '', & 'SYNOPSIS', & ' result = index( string, substring [,back] [,kind] )', & '', & ' elemental integer(kind=KIND) function index(string,substring,back,kind)', & '', & ' character(len=*,kind=KIND),intent(in) :: string', & ' character(len=*,kind=KIND),intent(in) :: substring', & ' logical(kind=**),intent(in),optional :: back', & ' integer(kind=**),intent(in),optional :: kind', & '', & 'CHARACTERISTICS', & ' o STRING is a character variable of any kind', & '', & ' o SUBSTRING is a character variable of the same kind as STRING', & '', & ' o BACK is a logical variable of any supported kind', & '', & ' o KIND is a scalar integer constant expression.', & '', & 'DESCRIPTION', & ' INDEX(3) returns the position of the start of the leftmost or rightmost', & ' occurrence of string SUBSTRING in STRING, counting from one. If SUBSTRING is', & ' not present in STRING, zero is returned.', & '', & 'OPTIONS', & ' o STRING : string to be searched for a match', & '', & ' o SUBSTRING : string to attempt to locate in STRING', & '', & ' o BACK : If the BACK argument is present and true, the return value is the', & ' start of the rightmost occurrence rather than the leftmost.', & '', & ' o KIND : if KIND is present, the kind type parameter is that specified by', & ' the value of KIND; otherwise the kind type parameter is that of default', & ' integer type.', & '', & 'RESULT', & ' The result is the starting position of the first substring SUBSTRING found', & ' in STRING.', & '', & ' If the length of SUBSTRING is longer than STRING the result is zero.', & '', & ' If the substring is not found the result is zero.', & '', & ' If BACK is .true. the greatest starting position is returned (that is, the', & ' position of the right-most match). Otherwise, the smallest position starting', & ' a match (ie. the left-most match) is returned.', & '', & ' The position returned is measured from the left with the first character of', & ' STRING being position one.', & '', & ' Otherwise, if no match is found zero is returned.', & '', & 'EXAMPLES', & ' Example program', & '', & ' program demo_index', & ' implicit none', & ' character(len=*),parameter :: str=&', & ' ''Search this string for this expression''', & ' !1234567890123456789012345678901234567890', & ' write(*,*)&', & ' index(str,''this'').eq.8, &', & ' ! return value is counted from the left end even if BACK=.TRUE.', & ' index(str,''this'',back=.true.).eq.24, &', & ' ! INDEX is case-sensitive', & ' index(str,''This'').eq.0', & ' end program demo_index', & '', & ' Expected Results:', & '', & ' > T T T', & '', & 'STANDARD', & ' FORTRAN 77 , with KIND argument Fortran 2003', & '', & 'SEE ALSO', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 index(3fortran)', & ''] shortname="index" call process() case('129','inquire') textblock=[character(len=256) :: & '', & 'inquire(7fortran) inquire(7fortran)', & '', & 'NAME', & ' inquire(7f) - [FILE_INQUIRE] File inquiry statement', & '', & 'SYNOPSIS', & ' INQUIRE([UNIT=file_unit_number]|[FILE=file_name_expr],', & '', & ' ACCESS = scalar_default_char_variable,', & ' ACTION = scalar_default_char_variable,', & ' ASYNCHRONOUS = scalar_default_char_variable,', & ' DIRECT = scalar_default_char_variable,', & '', & ' BLANK = scalar_default_char_variable,', & ' DECIMAL = scalar_default_char_variable,', & ' DELIM = scalar_default_char_variable,', & ' ENCODING = scalar_default_char_variable,', & ' PAD = scalar_default_char_variable,', & ' SIGN = scalar_default_char_variable,', & '', & ' ERR = label,', & ' IOMSG = iomsg_variable,', & ' IOSTAT = scalar_int_variable,', & '', & ' EXIST = scalar_logical_variable,', & ' FORM = scalar_default_char_variable,', & ' FORMATTED = scalar_default_char_variable,', & ' ID = scalar_int_expr,', & ' NAME = scalar_default_char_variable,', & ' NAMED = scalar_logical_variable,', & ' NEXTREC = scalar_int_variable,', & ' NUMBER = scalar_int_variable,', & ' OPENED = scalar_logical_variable,', & ' PENDING = scalar_logical_variable,', & ' POS = scalar_int_variable,', & ' POSITION = scalar_default_char_variable,', & ' READ = scalar_default_char_variable,', & ' READWRITE = scalar_default_char_variable,', & ' RECL = scalar_int_variable,', & ' ROUND = scalar_default_char_variable,', & ' SEQUENTIAL = scalar_default_char_variable,', & ' SIZE = scalar_int_variable,', & ' STREAM = scalar_default_char_variable,', & ' UNFORMATTED = scalar_default_char_variable,', & ' WRITE = scalar_default_char_variable )', & '', & ' or', & '', & ' INQUIRE(IOLENGTH=scalar_int_variable) output_item_list', & '', & 'DESCRIPTION', & ' The INQUIRE statement may be used to inquire about properties of a', & ' particular named file or of the connection to a particular unit. There are', & ' three forms of the INQUIRE statement:', & '', & ' o inquire by file, which uses the FILE= specifier', & '', & ' o inquire by unit, which uses the UNIT= specifier', & '', & ' o inquire by output list, which uses only the IOLENGTH= specifier.', & '', & ' All specifier value assignments are performed according to the rules for', & ' assignment statements.', & '', & ' For inquiry by unit, the unit specified need not exist or be connected to a', & ' file. If it is connected to a file, the inquiry is being made about the', & ' connection and about the file connected.', & '', & ' An INQUIRE statement may be executed before, while, or after a file is', & ' connected to a unit. All values assigned by an INQUIRE statement are those', & ' that are current at the time the statement is executed.', & '', & 'ERROR PROCESSING', & ' If an error condition occurs during execution of an INQUIRE statement, all', & ' of the inquiry specifier variables become undefined, except for variables in', & ' the IOSTAT= and IOMSG= specifiers (if any).', & '', & ' The IOSTAT=, ERR=, and IOMSG= specifiers are described in 9.11.', & '', & 'OPTIONS', & ' Unless constrained, the following inquiry specifiers may be used in either', & ' of the inquire by file or inquire by unit forms of the INQUIRE statement.', & '', & ' o No specifier shall appear more than once in a given inquire_spec_list.', & '', & ' o An inquire_spec_list shall contain one FILE= specifier or one UNIT=', & ' specifier, but not both.', & '', & ' o In the inquire by unit form of the INQUIRE statement, if the optional', & ' characters UNIT= are omitted, the file_unit-number shall be the first', & ' item in the inquire_spec_list.', & '', & ' o If an ID= specifier appears in an inquire_spec_list, a PENDING= specifier', & ' shall also appear.', & '', & ' o The label in the ERR= specifier shall be the statement label of a branch', & ' target statement that appears in the same scoping unit as the INQUIRE', & ' statement.', & '', & ' If file_unit-number identifies an internal unit, an error condition occurs.', & '', & ' When a returned value of a specifier other than the NAME= specifier is of', & ' type character, the value returned is in upper case.', & '', & ' The specifier that receives the returned value is a a default scalar', & ' variable.', & '', & 'INPUTS', & 'FILE', & ' The value of the file_name_expr in the FILE= specifier specifies the name of', & ' the file being inquired about. The named file need not exist or be connected', & ' to a unit. The value of the file_name_expr shall be of a form acceptable to', & ' the processor as a file name. Any trailing blanks are ignored. The', & ' interpretation of case is processor dependent.', & '', & 'UNIT', & 'OUTPUTS', & 'ACCESS', & ' SEQUENTIAL if the connection is for sequential access', & '', & ' DIRECT', & ' if the connection is for direct access', & '', & ' STREAM', & ' if the connection is for stream access.', & '', & ' UNDEFINED', & ' If there is no connection,', & '', & 'ACTION', & ' READ', & ' the connection is for input only,', & '', & ' WRITE', & ' the connection is for output only', & '', & ' READWRITE', & ' the connection is for both input and output.', & '', & ' UNDEFINED', & ' if there is no connection,', & '', & 'ASYNCHRONOUS', & ' YES', & ' if the connection allows asynchronous input/output', & '', & ' NO', & ' if the connection does not allow asynchronous input/output.', & '', & ' UNDEFINED', & ' If there is no connection', & '', & 'BLANK', & ' ZERO', & ' blanks are interpreted as zeros on input', & '', & ' NULL', & ' blanks are interpreted as a null on input', & '', & ' UNDEFINED', & ' no connection or the connection is not for formatted input/output', & '', & 'DECIMAL', & ' COMMA', & ' treat a comma as the separator between mantissa and decimal', & '', & ' POINT', & ' use a decimal point as the separator', & '', & 'DELIM', & ' APOSTROPHE,', & ' the delimiter mode in effect for a connection for', & '', & ' QUOTE,', & ' formatted input/output.', & '', & ' NONE', & ' UNDEFINED', & ' no connection or the connection is not for formatted input/output', & '', & 'DIRECT', & ' YES', & ' if DIRECT is included in the set of allowed access methods for the file', & '', & ' NO', & ' if DIRECT is not included in the set of allowed access methods for the', & ' file', & '', & ' UNKNOWN', & ' if the processor is unable to determine whether DIRECT is included in the', & ' set of allowed access methods for the file.', & '', & 'ENCODING', & ' UTF-8', & ' if the connection is for formatted input/output with an encoding form of', & ' UTF-8', & '', & ' UNDEFINED', & ' the connection is for unformatted input/output.', & '', & ' If there is no connection,', & '', & ' UTF-8', & ' if the processor is able to determine that the encoding form of the file', & ' is UTF-8', & '', & ' UNKNOWN', & ' if the processor is unable to determine the encoding form of the file', & '', & ' NOTE', & ' The value assigned may be something other than UTF-8, UNDEFINED, or UNKNOWN', & ' if the processor supports other specific encoding forms (e.g. UTF-16BE).', & '', & 'EXIST', & ' .true. if there exists a file with the specified name if inquire is by', & ' FILE=filename statement or if by UNIT=number and the specified unit exists.', & '', & ' .false. otherwise, false is assigned.', & '', & 'FORM', & ' FORMATTED if the connection is for formatted input/output, UNFORMATTED if', & ' the connection is for unformatted input/output. UNDEFINED If there is no', & ' connection', & '', & 'FORMATTED', & ' YES if FORMATTED is included in the set of allowed forms for the file NO if', & ' FORMATTED is not included in the set of allowed forms for the file UNKNOWN', & ' if the processor is unable to determine whether FORMATTED is included in the', & ' set of allowed forms for the file.', & '', & 'ID', & ' The value of the expression specified in the ID= specifier shall be the', & ' identifier of a pending data transfer operation for the specified unit.', & ' This specifier interacts with the PENDING= specifier.', & '', & 'NAME', & ' The scalar_default_char_variable in the NAME= specifier is assigned the', & ' value of the name of the file if the file has a name; otherwise, it becomes', & ' undefined.', & '', & ' NOTE', & ' If this specifier appears in an INQUIRE by file statement, its value is not', & ' necessarily the same as the name given in the FILE= specifier. However, the', & ' value returned shall be suitable for use as the value of the file_name_expr', & ' in the FILE= specifier in an OPEN statement.', & '', & ' The processor may return a file name qualified by a user identification,', & ' device, directory, or other relevant information.', & '', & ' The case of the characters assigned to scalar_default_char_variable is', & ' processor dependent.', & '', & 'NAMED', & ' The scalar_logical_variable in the NAMED= specifier is assigned the value', & ' true if the file has a name; otherwise, it is assigned the value false.', & '', & 'NEXTREC', & ' The scalar_int_variable in the NEXTREC= specifier is assigned the value n +', & ' 1, where n is the record number of the last record read from or written to', & ' the connection for direct access. If there is a connection but no records', & ' have been read or written since the connection, the scalar_int_variable is', & ' assigned the value 1. If there is no connection, the connection is not for', & ' direct access, or the position is indeterminate because of a previous error', & ' condition, the scalar_int_variable becomes undefined. If there are pending', & ' data transfer operations for the specified unit, the value assigned is', & ' computed as if all the pending data transfers had already completed.', & '', & 'NUMBER', & ' The scalar_int_variable in the NUMBER= specifier is assigned the value of', & ' the external unit number of the unit that is connected to the file. If', & ' there is no unit connected to the file, the value -1 is assigned.', & '', & 'OPENED', & ' .true. if the file specified is connected to a unit .false. otherwise', & '', & 'PAD', & ' YES, corresponding to the pad mode in effect for a connection. NO', & '', & 'UNDEFINED', & ' If there is no connection or if the connection is not for formatted', & ' input/output,', & '', & 'PENDING', & ' The PENDING= specifier is used to determine whether previously pending', & ' asynchronous data transfers are complete. A data transfer operation is', & ' previously pending if it is pending at the beginning of execution of the', & ' INQUIRE statement.', & '', & ' If an ID= specifier appears and the specified data transfer operation is', & ' complete, then the variable specified in the PENDING= specifier is assigned', & ' the value false and the INQUIRE statement performs the wait operation for', & ' the specified data transfer.', & '', & ' If the ID= specifier is omitted and all previously pending data transfer', & ' operations for the specified unit are complete, then the variable specified', & ' in the PENDING= specifier is assigned the value false and the INQUIRE', & ' statement performs wait operations for all previously pending data transfers', & ' for the specified unit.', & '', & ' In all other cases, the variable specified in the PENDING= specifier is', & ' assigned the value true and no wait operations are performed; in this case', & ' the previously pending data transfers remain pending after the execution of', & ' the INQUIRE statement.', & '', & ' NOTE:', & ' The processor has considerable flexibility in defining when', & ' it considers a transfer to be complete. Any of the following', & ' approaches could be used:', & '', & ' o The INQUIRE statement could consider an asynchronous data', & ' transfer to be incomplete until after', & ' the corresponding wait operation. In this case PENDING=', & ' would always return true unless there were no previously', & ' pending data transfers for the unit.', & '', & ' o The INQUIRE statement could wait for all specified data', & ' transfers to complete and then always return', & ' false for PENDING=.', & '', & ' o The INQUIRE statement could actually test the state of the', & ' specified data transfer operations.', & '', & 'POS', & ' The scalar_int_variable in the POS= specifier is assigned the number of the', & ' file storage unit immediately following the current position of a file', & ' connected for stream access. If the file is positioned at its terminal', & ' position, the variable is assigned a value one greater than the number of', & ' the highest-numbered file storage unit in the file. If the file is not', & ' connected for stream access or if the position of the file is indeterminate', & ' because of previous error conditions, the variable becomes undefined.', & '', & 'POSITION', & ' The scalar_default_char_variable in the POSITION= specifier is assigned the', & ' value REWIND if the connection was opened for positioning at its initial', & ' point, APPEND if the connection was opened for positioning before its', & ' endfile record or at its terminal point, and ASIS if the connection was', & ' opened without changing its position. If there is no connection or if the', & ' file is connected for direct access, the scalar_default_char_variable is', & ' assigned the value UNDEFINED. If the file has been repositioned since the', & ' connection, the scalar_default_char_variable is assigned a processor-', & ' dependent value, which shall not be REWIND unless the file is positioned at', & ' its initial point and shall not be APPEND unless the file is positioned so', & ' that its endfile record is the next record or at its terminal point if it', & ' has no endfile record.', & '', & 'READ', & ' The scalar_default_char_variable in the READ= specifier is assigned the', & ' value YES if READ is included in the set of allowed actions for the file, NO', & ' if READ is not included in the set of allowed actions for the file, and', & ' UNKNOWN if the processor is unable to determine whether READ is included in', & ' the set of allowed actions for the file.', & '', & 'READWRITE', & ' The scalar_default_char_variable in the READWRITE= specifier is assigned the', & ' value YES if READWRITE is included in the set of allowed actions for the', & ' file, NO if READWRITE is not included in the set of allowed actions for the', & ' file, and UNKNOWN if the processor is unable to determine whether READWRITE', & ' is included in the set of allowed actions for the file.', & '', & 'RECL', & ' The scalar_int_variable in the RECL= specifier is assigned the value of the', & ' record length of a connection for direct access, or the value of the maximum', & ' record length of a connection for sequential access. If the connection is', & ' for formatted input/output, the length is the number of characters for all', & ' records that contain only characters of default kind. If the connection is', & ' for unformatted input/output, the length is measured in file storage units.', & ' If there is no connection, or if the connection is for stream access, the', & ' scalar_int_variable becomes undefined.', & '', & 'ROUND', & ' The scalar_default_char_variable in the ROUND= specifier is assigned the', & ' value UP, DOWN, ZERO, NEAREST, COMPATIBLE, or PROCESSOR DEFINED,', & ' corresponding to the I/O rounding mode in effect for a connection for', & ' formatted input/output. If there is no connection or if the connection is', & ' not for formatted input/output, the scalar_default_char_variable is assigned', & ' the value UNDEFINED. The processor shall return the value PROCESSOR DEFINED', & ' only if the behavior of the current I/O rounding mode is different from that', & ' of the UP, DOWN, ZERO, NEAREST, and COMPATIBLE modes.', & '', & 'SEQUENTIAL', & ' The scalar_default_char_variable in the SEQUENTIAL= specifier is assigned', & ' the value YES if SEQUENTIAL is included in the set of allowed access methods', & ' for the file, NO if SEQUENTIAL is not included in the set of allowed access', & ' methods for the file, and UNKNOWN if the processor is unable to determine', & ' whether SEQUENTIAL is included in the set of allowed access methods for the', & ' file.', & '', & 'SIGN', & ' The scalar_default_char_variable in the SIGN= specifier is assigned the', & ' value PLUS, SUPPRESS, or PROCESSOR DEFINED, corresponding to the sign mode', & ' in effect for a connection for formatted input/output. If there is no', & ' connection, or if the connection is not for formatted input/output, the', & ' scalar_default_char_variable is assigned the value UNDEFINED.', & '', & 'SIZE', & ' The scalar_int_variable in the SIZE= specifier is assigned the size of the', & ' file in file storage units. If the file size cannot be determined, the', & ' variable is assigned the value -1.', & '', & ' For a file that may be connected for stream access, the file size is the', & ' number of the highest-numbered file storage unit in the file.', & '', & ' For a file that may be connected for sequential or direct access, the file', & ' size may be different from the number of storage units implied by the data', & ' in the records; the exact relationship is processor-dependent.', & '', & 'STREAM', & ' The scalar_default_char_variable in the STREAM= specifier is assigned the', & ' value YES if STREAM is included in the set of allowed access methods for the', & ' file, NO if STREAM is not included in the set of allowed access methods for', & ' the file, and UNKNOWN if the processor is unable to determine whether STREAM', & ' is included in the set of allowed access methods for the file.', & '', & 'UNFORMATTED', & ' The scalar_default_char_variable in the UNFORMATTED= specifier is assigned', & ' the value YES if UNFORMATTED is included in the set of allowed forms for the', & ' file, NO if UNFORMATTED is not included in the set of allowed forms for the', & ' file, and UNKNOWN if the processor is unable to determine whether', & ' UNFORMATTED is included in the set of allowed forms for the file.', & '', & 'WRITE', & ' The scalar_default_char_variable in the WRITE= specifier is assigned the', & ' value YES if WRITE is included in the set of allowed actions for the file,', & ' NO if WRITE is not included in the set of allowed actions for the file, and', & ' UNKNOWN if the processor is unable to determine whether WRITE is included in', & ' the set of allowed actions for the file.', & '', & 'INQUIRE BY OUTPUT LIST', & ' The scalar_int_variable in the IOLENGTH= specifier is assigned the', & ' processor-dependent number of file storage units that would be required to', & ' store the data of the output list in an unformatted file. The value shall be', & ' suitable as a RECL= specifier in an OPEN statement that connects a file for', & ' unformatted direct access when there are input/output statements with the', & ' same input/output list.', & '', & ' The output list in an INQUIRE statement shall not contain any derived-type', & ' list items that require a defined input/output procedure as described in', & ' subclause 9.6.3. If a derived-type list item appears in the output list, the', & ' value returned for the IOLENGTH= specifier assumes that no defined', & ' input/output procedure will be invoked.', & '', & 'EXAMPLES', & ' Examples of INQUIRE statements are:', & '', & ' INQUIRE (IOLENGTH = IOL) A (1:N)', & ' INQUIRE (UNIT = JOAN, OPENED = LOG_01, NAMED = LOG_02, &', & ' FORM = CHAR_VAR, IOSTAT = IOS)', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_inquire', & ' implicit none', & ' integer :: lun=40', & ' integer :: iostat', & ' write(*,*)''is it open or predefined?''', & ' call print_inquire(lun,'''')', & ' write(*,*)''what are the defaults?''', & ' open(unit=lun)', & ' call print_inquire(lun,'''')', & ' close(unit=lun,status=''delete'',iostat=iostat)', & ' contains', & ' subroutine print_inquire(lun_in,filename)', & '', & ' ! @(#) print_inquire(3f) print INQUIRE of file by name/number', & '', & ' integer,intent(in),optional :: lun_in', & ' character(len=*),intent(in),optional :: filename', & ' integer :: iostat', & ' character(len=256) :: message', & ' character(len=:),allocatable :: filename_', & ' integer :: lun', & ' ! STATUS=NEW|REPLACE|OLD|SCRATCH|UNKNOWN', & ' ! SEQUENTIAL | DIRECT | STREAM | UNDEFINED', & ' character(len=20) :: access ; namelist/inquire/access', & ' character(len=20) :: asynchronous ; namelist/inquire/asynchronous', & ' character(len=20) :: blank ; namelist/inquire/blank', & ' character(len=20) :: decimal ; namelist/inquire/decimal', & ' character(len=20) :: delim ; namelist/inquire/delim', & ' character(len=20) :: direct ; namelist/inquire/direct', & ' character(len=20) :: encoding ; namelist/inquire/encoding', & ' ! FORMATTED | UNFORMATTED', & ' character(len=20) :: form ; namelist/inquire/form', & ' character(len=20) :: formatted ; namelist/inquire/formatted', & ' character(len=20) :: unformatted ; namelist/inquire/unformatted', & ' character(len=20) :: name ; namelist/inquire/name', & ' character(len=20) :: pad ; namelist/inquire/pad', & ' ! ASIS | REWIND | APPEND', & ' character(len=20) :: position ; namelist/inquire/position', & ' ! READ | WRITE | READWRITE', & ' character(len=20) :: action ; namelist/inquire/action', & ' character(len=20) :: read ; namelist/inquire/read', & ' character(len=20) :: readwrite ; namelist/inquire/readwrite', & ' character(len=20) :: write ; namelist/inquire/write', & ' character(len=20) :: round ; namelist/inquire/round', & ' character(len=20) :: sequential ; namelist/inquire/sequential', & ' character(len=20) :: sign ; namelist/inquire/sign', & ' character(len=20) :: stream ; namelist/inquire/stream', & ' integer :: id ; namelist/inquire/id', & ' integer :: nextrec ; namelist/inquire/nextrec', & ' integer :: number ; namelist/inquire/number', & ' integer :: pos ; namelist/inquire/pos', & ' integer :: recl ; namelist/inquire/recl', & ' integer :: size ; namelist/inquire/size', & ' logical :: exist ; namelist/inquire/exist', & ' logical :: named ; namelist/inquire/named', & ' logical :: opened ; namelist/inquire/opened', & ' logical :: pending ; namelist/inquire/pending', & '', & ' if(present(filename))then', & ' filename_ =filename', & ' else', & ' filename_ =''''', & ' endif', & ' lun=merge(lun_in,-1,present(lun_in))', & ' ! exist, opened, and named always become defined', & ' ! unless an error condition occurs.', & ' if(filename_ == ''''.and.lun /= -1)then', & ' write(*,*)''*print_inquire* checking unit'',lun', & ' inquire(unit=lun,recl=recl,nextrec=nextrec,pos=pos,size=size, &', & ' & position=position,name=name,form=form,formatted=formatted, &', & ' & unformatted=unformatted,access=access,sequential=sequential, &', & ' & direct=direct,stream=stream,action=action,read=read,write=write, &', & ' & readwrite=readwrite,sign=sign,round=round,blank=blank, &', & ' & decimal=decimal,delim=delim,encoding=encoding,pad=pad, &', & ' & named=named,opened=opened,exist=exist,number=number, &', & ' !bug & pending=pending, &', & ' & asynchronous=asynchronous, &', & ' & iostat=iostat,err=999,iomsg=message)', & ' elseif(filename_ /= '''')then', & ' write(*,*)''*print_inquire* checking file:''//filename_', & ' inquire(file=filename_, &', & ' & recl=recl,nextrec=nextrec,pos=pos, &', & ' & size=size,position=position,name=name, &', & ' & form=form,formatted=formatted,unformatted=unformatted, &', & ' & access=access,sequential=sequential,direct=direct,stream=stream, &', & ' & action=action,read=read,write=write,readwrite=readwrite, &', & ' & sign=sign,round=round,blank=blank,decimal=decimal,delim=delim, &', & ' & encoding=encoding,pad=pad,named=named,opened=opened,exist=exist, &', & ' & number=number,pending=pending,asynchronous=asynchronous, &', & ' & iostat=iostat,err=999,iomsg=message)', & ' else', & ' write(*,*) &', & ' & ''*print_inquire* must specify either filename or unit number''', & ' endif', & ' write(*,nml=inquire,delim=''none'')', & ' return', & ' 999 continue', & ' write(*,*)''*print_inquire* bad inquire''', & ' ! If an error condition occurs during execution of an INQUIRE statement,', & ' ! all of the inquiry identifiers except iostat become undefined.', & ' write(*,*) ''*print_inquire* inquire call failed,iostat='',iostat, &', & ' & ''message='',message', & ' end subroutine print_inquire', & ' end program demo_inquire', & '', & 'SEE ALSO', & ' BACKSPACE(7), CLOSE(7), ENDFILE(7), FLUSH(7), INQUIRE(7), OPEN(7), PRINT(7),', & ' READ(7), REWIND(7), WAIT(7), WRITE(7)', & '', & ' March 16, 2025 inquire(7fortran)', & ''] shortname="inquire" call process() case('130','int') textblock=[character(len=256) :: & '', & 'int(3fortran) int(3fortran)', & '', & 'NAME', & ' INT(3) - [TYPE:CONVERSION] Truncate towards zero and convert to integer', & '', & 'SYNOPSIS', & ' result = int(a [,kind])', & '', & ' elemental integer(kind=KIND) function int(a, KIND )', & '', & ' TYPE(kind=**),intent(in) :: a', & ' integer,optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o A shall be of type integer, real, or complex, or a boz-literal-constant.', & '', & ' o KIND shall be a scalar integer constant expression.', & '', & 'DESCRIPTION', & ' INT(3) truncates towards zero and return an integer.', & '', & 'OPTIONS', & ' o A : is the value to truncate towards zero', & '', & ' o KIND : indicates the kind parameter of the result. If not present the', & ' returned type is that of default integer type.', & '', & 'RESULT', & ' returns an integer variable applying the following rules:', & '', & ' CASE:', & '', & ' 1. If A is of type integer, INT(a) = a', & '', & ' 2. If A is of type real and |A| < 1, INT(A) equals 0. If |A| >= 1, then', & ' INT(A) equals the integer whose magnitude does not exceed A and whose', & ' sign is the same as the sign of A.', & '', & ' 3. If A is of type complex, rule 2 is applied to the real part of A.', & '', & ' 4. If a is a boz-literal constant, it is treated as an integer with the', & ' kind specified.', & '', & ' The interpretation of a bit sequence whose most significant bit is 1 is', & ' processor dependent.', & '', & ' The result is undefined if it cannot be represented in the specified integer', & ' type.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_int', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: i = 42', & ' complex :: z = (-3.7, 1.0)', & ' real :: x=-10.5, y=10.5', & '', & ' print *, int(x), int(y)', & '', & ' print *, int(i)', & '', & ' print *, int(z), int(z,8)', & ' ! elemental', & ' print *, int([-10.9,-10.5,-10.3,10.3,10.5,10.9])', & ' ! note int(3) truncates towards zero', & '', & ' ! CAUTION:', & ' ! a number bigger than a default integer can represent', & ' ! produces an incorrect result and is not required to', & ' ! be detected by the program.', & ' x=real(huge(0))+1000.0', & ' print *, int(x),x', & ' ! using a larger kind', & ' print *, int(x,kind=int64),x', & '', & ' print *, int(&', & ' & B"111111111111111111111111111111111111111111111111111111111111111",&', & ' & kind=int64)', & ' print *, int(O"777777777777777777777",kind=int64)', & ' print *, int(Z"7FFFFFFFFFFFFFFF",kind=int64)', & '', & ' ! elemental', & ' print *', & ' print *,int([ &', & ' & -2.7, -2.5, -2.2, -2.0, -1.5, -1.0, -0.5, &', & ' & 0.0, &', & ' & +0.5, +1.0, +1.5, +2.0, +2.2, +2.5, +2.7 ])', & '', & ' end program demo_int', & '', & ' Results:', & '', & ' > -10 10', & ' > 42', & ' > -3 -3', & ' > -10 -10 -10 10 10 10', & ' > -2147483648 2.14748467E+09', & ' > 2147484672 2.14748467E+09', & ' > 9223372036854775807', & ' > 9223372036854775807', & ' > 9223372036854775807', & ' >', & ' > -2 -2 -2 -2 -1', & ' > -1 0 0 0 1', & ' > 1 2 2 2 2', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' AINT(3), ANINT(3), NINT(3), SELECTED_INT_KIND(3), CEILING(3), FLOOR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 int(3fortran)', & ''] shortname="int" call process() case('131','ior') textblock=[character(len=256) :: & '', & 'ior(3fortran) ior(3fortran)', & '', & 'NAME', & ' IOR(3) - [BIT:LOGICAL] Bitwise logical inclusive OR', & '', & 'SYNOPSIS', & ' result = ior(i, j)', & '', & ' elemental integer(kind=KIND) function ior(i,j)', & '', & ' integer(kind=KIND ,intent(in) :: i', & ' integer(kind=KIND ,intent(in) :: j', & '', & 'CHARACTERISTICS', & ' o I, J and the result shall have the same integer type and kind, with the', & ' exception that one of I or J may be a BOZ constant.', & '', & 'DESCRIPTION', & ' IOR(3) returns the bit-wise Boolean inclusive-or of I and J.', & '', & 'OPTIONS', & ' o I : one of the pair of values to compare the bits of', & '', & ' o J : one of the pair of values to compare the bits of', & '', & ' If either I or J is a BOZ-literal-constant, it is first converted as if by', & ' the intrinsic function INT(3) to type integer with the kind type parameter', & ' of the other.', & '', & 'RESULT', & ' The result has the value obtained by combining I and J bit-by-bit according', & ' to the following table:', & '', & ' I J IOR (I, J)', & ' 1 1 1', & ' 1 0 1', & ' 0 1 1', & ' 0 0 0', & '', & ' Where if the bit is set in either input value, it is set in the result.', & ' Otherwise the result bit is zero.', & '', & ' This is commonly called the "bitwise logical inclusive OR" of the two', & ' values.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ior', & ' implicit none', & ' integer :: i, j, k', & ' i=53 ! i=00110101 binary (lowest order byte)', & ' j=45 ! j=00101101 binary (lowest order byte)', & ' k=ior(i,j) ! k=00111101 binary (lowest order byte), k=61 decimal', & ' write(*,''(i8,1x,b8.8)'')i,i,j,j,k,k', & ' end program demo_ior', & '', & ' Results:', & '', & ' > 53 00110101', & ' > 45 00101101', & ' > 61 00111101', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' BTEST(3), IAND(3), IBCLR(3), IBITS(3), IBSET(3), IEOR(3), MVBITS(3), NOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ior(3fortran)', & ''] shortname="ior" call process() case('132','iparity') textblock=[character(len=256) :: & '', & 'iparity(3fortran) iparity(3fortran)', & '', & 'NAME', & ' IPARITY(3) - [BIT:LOGICAL] Bitwise exclusive OR of array elements', & '', & 'SYNOPSIS', & ' result = iparity( array [,mask] ) | iparity( array, dim [,mask] )', & '', & ' integer(kind=KIND) function iparity(array, dim, mask )', & '', & ' integer(kind=KIND),intent(in) :: array(..)', & ' logical(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & '', & ' o ARRAY - An integer array.', & '', & ' o DIM - an integer scalar from 1 to the rank of ARRAY', & '', & ' o MASK - logical conformable with ARRAY.', & '', & 'DESCRIPTION', & ' IPARITY(3) reduces with bitwise xor (exclusive or) the elements of ARRAY', & ' along dimension DIM if the corresponding element in MASK is .true..', & '', & 'OPTIONS', & ' o ARRAY : an array of integer values', & '', & ' o DIM : a value from 1 to the rank of ARRAY.', & '', & ' o MASK : a logical mask either a scalar or an array of the same shape as', & ' ARRAY.', & '', & 'RESULT', & ' The result is of the same type as ARRAY.', & '', & ' If DIM is absent, a scalar with the bitwise xor of all elements in ARRAY is', & ' returned. Otherwise, an array of rank N-1, where N equals the rank of ARRAY,', & ' and a shape similar to that of ARRAY with dimension DIM dropped is returned.', & '', & ' Case (i) : The result of IPARITY (ARRAY) has a value equal to the bitwise', & ' exclusive OR of all the elements of ARRAY. If ARRAY has size zero the result', & ' has the value zero.', & '', & ' Case (ii) : The result of IPARITY (ARRAY, MASK=MASK) has a value equal to', & ' that of', & '', & ' IPARITY (PACK (ARRAY, MASK)).', & '', & ' Case (iii) : The result of IPARITY (ARRAY, DIM=DIM [, MASK=MASK]) has a', & ' value equal to that of IPARITY (ARRAY [, MASK=MASK]) if ARRAY has rank one.', & '', & ' Otherwise, an array of values reduced along the dimension', & ' DIM is returned.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_iparity', & ' implicit none', & ' integer, dimension(2) :: a', & ' a(1) = int(b''00100100'')', & ' a(2) = int(b''01101010'')', & ' print ''(b8.8)'', iparity(a)', & ' end program demo_iparity', & '', & ' Results:', & '', & ' > 01001110', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' IANY(3), IALL(3), IEOR(3), PARITY(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 iparity(3fortran)', & ''] shortname="iparity" call process() case('133','is_contiguous') textblock=[character(len=256) :: & '', & 'is_contiguous(3fortran) is_contiguous(3fortran)', & '', & 'NAME', & ' IS_CONTIGUOUS(3) - [ARRAY:INQUIRY] Test if object is contiguous', & '', & 'SYNOPSIS', & ' result = is_contiguous(array)', & '', & ' logical function is_contiguous(array)', & '', & ' type(TYPE(kind=**)),intent(in) :: array', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o ARRAY may be of any type. It shall be an array or assumed-rank. If it is', & ' a pointer it shall be associated.', & '', & ' o the result is a default logical scalar', & '', & 'DESCRIPTION', & ' IS_CONTIGUOUS(3) returns .true. if and only if an object is contiguous.', & '', & ' An object is contiguous if it is', & '', & ' o (1) an object with the CONTIGUOUS attribute,', & '', & ' o (2) a nonpointer whole array that is not assumed-shape,', & '', & ' o (3) an assumed-shape array that is argument associated with an array that', & ' is contiguous,', & '', & ' o (4) an array allocated by an ALLOCATE statement,', & '', & ' o (5) a pointer associated with a contiguous target, or', & '', & ' o (6) a nonzero-sized array section provided that', & '', & ' o (A) its base object is contiguous,', & '', & ' o (B) it does not have a vector subscript,', & '', & ' o (C) the elements of the section, in array element order, are a subset', & ' of the base object elements that are consecutive in array element', & ' order,', & '', & ' o (D) if the array is of type character and a substring-range appears,', & ' the substring-range specifies all of the characters of the parent-', & ' string,', & '', & ' o (E) only its final part-ref has nonzero rank, and', & '', & ' o (F) it is not the real or imaginary part of an array of type complex.', & '', & ' An object is not contiguous if it is an array subobject, and', & '', & ' o the object has two or more elements,', & '', & ' o the elements of the object in array element order are not consecutive in', & ' the elements of the base object,', & '', & ' o the object is not of type character with length zero, and', & '', & ' o the object is not of a derived type that has no ultimate components other', & ' than zero-sized arrays and', & '', & ' o characters with length zero.', & '', & ' It is processor-dependent whether any other object is contiguous.', & '', & 'OPTIONS', & ' o ARRAY : An array of any type to be tested for being contiguous. If it is', & ' a pointer it shall be associated.', & '', & 'RESULT', & ' The result has the value .true. if ARRAY is contiguous, and .false.', & ' otherwise.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_is_contiguous', & ' implicit none', & ' intrinsic is_contiguous', & ' real, DIMENSION (1000, 1000), TARGET :: A', & ' real, DIMENSION (:, :), POINTER :: IN, OUT', & ' IN => A ! Associate IN with target A', & ' OUT => A(1:1000:2,:) ! Associate OUT with subset of target A', & ' !', & ' write(*,*)''IN is '',IS_CONTIGUOUS(IN)', & ' write(*,*)''OUT is '',IS_CONTIGUOUS(OUT)', & ' !', & ' end program demo_is_contiguous', & '', & ' Results:', & '', & ' > IN is T', & ' > OUT is F', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' o allocated(3) - Allocation status of an allocatable entity', & '', & ' o is_contiguous(3) - Test if object is contiguous', & '', & ' o lbound(3) - Lower dimension bounds of an array', & '', & ' o rank(3) - Rank of a data object', & '', & ' o shape(3) - Determine the shape of an array or scalar', & '', & ' o size(3) - Determine the size of an array or extent of one dimension', & '', & ' o ubound(3) - Upper dimension bounds of an array', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 is_contiguous(3fortran)', & ''] shortname="is_contiguous" call process() case('134','ishft') textblock=[character(len=256) :: & '', & 'ishft(3fortran) ishft(3fortran)', & '', & 'NAME', & ' ISHFT(3) - [BIT:SHIFT] Logical shift of bits in an integer', & '', & 'SYNOPSIS', & ' result = ishftc( i, shift )', & '', & ' elemental integer(kind=KIND) function ishft(i, shift )', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=**),intent(in) :: shift', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o I is an integer of any kind. the kind for I dictates the kind of the', & ' returned value.', & '', & ' o SHIFT is an integer of any kind.', & '', & 'DESCRIPTION', & ' ISHFT(3) returns a value corresponding to I with all of the bits shifted', & ' SHIFT places left or right as specified by the sign and magnitude of SHIFT.', & '', & ' Bits shifted out from the left end or right end are lost; zeros are shifted', & ' in from the opposite end.', & '', & 'OPTIONS', & ' o I : The value specifying the pattern of bits to shift', & '', & ' o SHIFT : A value of SHIFT greater than zero corresponds to a left shift, a', & ' value of zero corresponds to no shift, and a value less than zero', & ' corresponds to a right shift.', & '', & ' If the absolute value of SHIFT is greater than BIT_SIZE(I), the value is', & ' undefined.', & '', & 'RESULT', & ' The result has the value obtained by shifting the bits of I by SHIFT', & ' positions.', & '', & ' 1. If SHIFT is positive, the shift is to the left', & '', & ' 2. if SHIFT is negative, the shift is to the right', & '', & ' 3. if SHIFT is zero, no shift is performed.', & '', & ' Bits shifted out from the left or from the right, as appropriate, are lost.', & ' Zeros are shifted in from the opposite end.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ishft', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: shift', & ' character(len=*),parameter :: g=''(b32.32,1x,i0)''', & '', & ' write(*,*) ishft(3, 1),'' <== typically should have the value 6''', & '', & ' shift=4', & ' write(*,g) ishft(huge(0),shift), shift', & ' shift=0', & ' write(*,g) ishft(huge(0),shift), shift', & ' shift=-4', & ' write(*,g) ishft(huge(0),shift), shift', & ' end program demo_ishft', & '', & ' Results:', & '', & ' > 6 <== typically should have the value 6', & ' > 11111111111111111111111111110000 4', & ' > 01111111111111111111111111111111 0', & ' > 00000111111111111111111111111111 -4', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' ISHFTC(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ishft(3fortran)', & ''] shortname="ishft" call process() case('135','ishftc') textblock=[character(len=256) :: & '', & 'ishftc(3fortran) ishftc(3fortran)', & '', & 'NAME', & ' ISHFTC(3) - [BIT:SHIFT] Shift rightmost bits circularly, AKA. a logical', & ' shift', & '', & 'SYNOPSIS', & ' result = ishftc( i, shift [,size] )', & '', & ' elemental integer(kind=KIND) function ishftc(i, shift, size)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=**),intent(in) :: shift', & ' integer(kind=**),intent(in),optional :: size', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o I may be an integer of any kind', & '', & ' o SHIFT and SIZE may be integers of any kind', & '', & ' o the kind for I dictates the kind of the returned value.', & '', & 'DESCRIPTION', & ' ISHFTC(3) circularly shifts just the specified rightmost bits of an integer.', & '', & ' ISHFTC(3) returns a value corresponding to I with the rightmost SIZE bits', & ' shifted circularly SHIFT places; that is, bits shifted out one end of the', & ' section are shifted into the opposite end of the section.', & '', & ' A value of SHIFT greater than zero corresponds to a left shift, a value of', & ' zero corresponds to no shift, and a value less than zero corresponds to a', & ' right shift.', & '', & 'OPTIONS', & ' o I : The value specifying the pattern of bits to shift', & '', & ' o SHIFT : If SHIFT is positive, the shift is to the left; if SHIFT is', & ' negative, the shift is to the right; and if SHIFT is zero, no shift is', & ' performed.', & '', & ' The absolute value of SHIFT must be less than SIZE (simply put, the', & ' number of positions to shift must be less than or equal to the number of', & ' bits specified to be shifted).', & '', & ' o SIZE : The value must be greater than zero and less than or equal to', & ' BIT_SIZE(i).', & '', & ' The default if BIT_SIZE(I) is absent is to circularly shift the entire', & ' value I.', & '', & 'RESULT', & ' The result characteristics (kind, shape, size, rank, ...) are the same as I.', & '', & ' The result has the value obtained by shifting the SIZE rightmost bits of I', & ' circularly by SHIFT positions.', & '', & ' No bits are lost.', & '', & ' The unshifted bits are unaltered.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_ishftc', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: i', & ' character(len=*),parameter :: g=''(b32.32,1x,i0)''', & ' ! basics', & ' write(*,*) ishftc(3, 1),'' <== typically should have the value 6''', & '', & ' print *, ''lets start with this:''', & ' write(*,''(b32.32)'')huge(0)', & ' print *, ''shift the value by various amounts, negative and positive''', & ' do i= -bit_size(0), bit_size(0), 8', & ' write(*,g) ishftc(huge(0),i), i', & ' enddo', & ' print *,''elemental''', & ' i=huge(0)', & ' write(*,*)ishftc(i,[2,3,4,5])', & ' write(*,*)ishftc([2**1,2**3,-2**7],3)', & ' print *,''note the arrays have to conform when elemental''', & ' write(*,*)ishftc([2**1,2**3,-2**7],[5,20,0])', & '', & ' end program demo_ishftc', & '', & ' Results:', & '', & ' > 6 <== typically should have the value 6', & ' > lets start with this:', & ' > 01111111111111111111111111111111', & ' > shift the value by various amounts, negative and positive', & ' > 01111111111111111111111111111111 -32', & ' > 11111111111111111111111101111111 -24', & ' > 11111111111111110111111111111111 -16', & ' > 11111111011111111111111111111111 -8', & ' > 01111111111111111111111111111111 0', & ' > 11111111111111111111111101111111 8', & ' > 11111111111111110111111111111111 16', & ' > 11111111011111111111111111111111 24', & ' > 01111111111111111111111111111111 32', & ' > elemental', & ' > -3 -5 -9 -17', & ' > 16 64 -1017', & ' > note the arrays have to conform when elemental', & ' > 64 8388608 -128', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o ISHFT(3) - Logical shift of bits in an integer', & '', & ' o SHIFTA(3) - Right shift with fill', & '', & ' o SHIFTL(3) - Shift bits left', & '', & ' o SHIFTR(3) - Combined right shift of the bits of two int...', & '', & ' o DSHIFTL(3) - Combined left shift of the bits of two inte...', & '', & ' o DSHIFTR(3) - Combined right shift of the bits of two int...', & '', & ' o CSHIFT(3) - Circular shift elements of an array', & '', & ' o EOSHIFT(3) - End-off shift elements of an array', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ishftc(3fortran)', & ''] shortname="ishftc" call process() case('136','is_iostat_end') textblock=[character(len=256) :: & '', & 'is_iostat_end(3fortran) is_iostat_end(3fortran)', & '', & 'NAME', & ' IS_IOSTAT_END(3) - [STATE:INQUIRY] Test for end-of-file value', & '', & 'SYNOPSIS', & ' result = is_iostat_end(i)', & '', & ' elemental logical function is_iostat_end(i)', & '', & ' integer,intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o I is integer of any kind', & '', & ' o the return value is a default logical', & '', & 'DESCRIPTION', & ' IS_IOSTAT_END(3) tests whether a variable (assumed returned as a status from', & ' an I/O statement) has the "end of file" I/O status value.', & '', & ' The function is equivalent to comparing the variable with the IOSTAT_END', & ' parameter of the intrinsic module ISO_FORTRAN_ENV.', & '', & 'OPTIONS', & ' o I : An integer status value to test if indicating end of file.', & '', & 'RESULT', & ' returns .true. if and only ifI has the value which indicates an end of file', & ' condition for IOSTAT= specifiers, and is .false. otherwise.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_iostat', & ' implicit none', & ' integer,parameter :: wp=kind(0.0d0)', & ' real(kind=wp) :: value', & ' integer :: iostat', & ' integer :: lun', & ' character(len=256) :: message', & ' ! make a scratch input file for demonstration purposes', & ' call makefile(lun)', & ' write(*,*)''Begin entering numeric values, one per line''', & ' do', & ' read(lun,*,iostat=iostat,iomsg=message)value', & ' if(iostat.eq.0)then', & ' write(*,*)''VALUE='',value', & ' elseif( is_iostat_end(iostat) ) then', & ' stop ''end of file. Goodbye!''', & ' else', & ' write(*,*)''ERROR:'',iostat,trim(message)', & ' exit', & ' endif', & ' !', & ' enddo', & ' contains', & ' subroutine makefile(lun)', & ' ! make a scratch file just for demonstration purposes', & ' integer :: lun', & ' integer :: i', & ' character(len=255),parameter :: fakefile(*)=[character(len=255) :: &', & '', & ' ''3.141592653589793238462643383279502884197169399375105820974944592307 &', & ' &/ pi'', &', & '', & ' ''0.577215664901532860606512090082402431042 &', & ' &/ The Euler-Mascheroni constant (Gamma)'', &', & '', & ' ''2.71828182845904523536028747135266249775724709369995 &', & ' &/ Napier''''s constant "e"&', & ' & is the base of the natural logarithm system,&', & ' & named in honor of Euler '', &', & '', & ' ''1.6180339887498948482045868 &', & ' &/ Golden_Ratio'', &', & '', & ' ''1 / unity'', &', & ' '''']', & ' !''/ end of data'']', & '', & ' open(newunit=lun,status=''replace'',file=''data.txt'',action=''readwrite'')', & ' write(lun,''(a)'')(trim(fakefile(i)),i=1,size(fakefile))', & ' rewind(lun)', & ' end subroutine makefile', & ' end program demo_iostat', & '', & ' Results:', & '', & ' > Begin entering numeric values, one per line', & ' > VALUE= 3.1415926535897931', & ' > VALUE= 0.57721566490153287', & ' > VALUE= 2.7182818284590451', & ' > VALUE= 1.6180339887498949', & ' > VALUE= 1.0000000000000000', & ' > STOP end of file. Goodbye!', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' o associated(3) - Association status of a pointer or pointer/target pair', & '', & ' o extends_type_of(3) - Determine if the dynamic type of A is an extension', & ' of the dynamic type of MOLD.', & '', & ' o is_iostat_end(3) - Test for end-of-file value', & '', & ' o is_iostat_eor(3) - Test for end-of-record value', & '', & ' o present(3) - Determine whether an optional dummy argument is specified', & '', & ' o same_type_as(3) - Query dynamic types for equality', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 is_iostat_end(3fortran)', & ''] shortname="is_iostat_end" call process() case('137','is_iostat_eor') textblock=[character(len=256) :: & '', & 'is_iostat_eor(3fortran) is_iostat_eor(3fortran)', & '', & 'NAME', & ' IS_IOSTAT_EOR(3) - [STATE:INQUIRY] Test for end-of-record value', & '', & 'SYNOPSIS', & ' result = is_iostat_eor(i)', & '', & ' elemental integer function is_iostat_eor(i)', & '', & ' integer(kind=KIND),intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o I is integer of any kind', & '', & ' o the return value is a default logical', & '', & 'DESCRIPTION', & ' IS_IOSTAT_EOR(3) tests whether a variable has the value of the I/O status', & ' "end of record". The function is equivalent to comparing the variable with', & ' the IOSTAT_EOR parameter of the intrinsic module ISO_FORTRAN_ENV.', & '', & 'OPTIONS', & ' o I : The value to test as indicating "end of record".', & '', & 'RESULT', & ' Returns .true. if and only if I has the value which indicates an end-of-', & ' record condition for iostat= specifiers, and is .false. otherwise.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_is_iostat_eor', & ' use iso_fortran_env, only : iostat_eor', & ' implicit none', & ' integer :: inums(5), lun, ios', & '', & ' ! create a test file to read from', & ' open(newunit=lun, form=''formatted'',status=''scratch'',action=''readwrite'')', & ' write(lun, ''(a)'') &', & ' ''10 20 30'', &', & ' ''40 50 60 70'', &', & ' ''80 90'', &', & ' ''100'', &', & ' ''110 120 130'', &', & ' ''140''', & ' rewind(lun)', & '', & ' do', & ' read(lun, *, iostat=ios) inums', & ' write(*,*)''iostat='',ios', & ' if(is_iostat_eor(ios)) then', & ' inums=-huge(0)', & ' print *, ''end of record''', & ' elseif(is_iostat_end(ios)) then', & ' print *,''end of file''', & ' inums=-huge(0)', & ' exit', & ' elseif(ios.ne.0)then', & ' print *,''I/O error'',ios', & ' inums=-huge(0)', & ' exit', & ' else', & ' write(*,''(*(g0,1x))'')''inums='',inums', & ' endif', & ' enddo', & '', & ' close(lun,iostat=ios,status=''delete'')', & '', & ' end program demo_is_iostat_eor', & '', & ' Results:', & '', & ' > iostat= 0', & ' > inums= 10 20 30 40 50', & ' > iostat= 0', & ' > inums= 80 90 100 110 120', & ' > iostat= -1', & ' > end of file', & '', & ' Note: the list-directed read starts on a new line with each read, and that', & ' the read values should not portably be used if IOSTAT is not zero.', & '', & ' Format descriptors, Stream I/O and non-advancing I/O and reads into strings', & ' that can then be parsed or read multiple times give full control of what is', & ' read. List-directed I/O is generally more appropriate for interactive I/O.', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' o associated(3) - Association status of a pointer or pointer/target pair', & '', & ' o extends_type_of(3) - Determine if the dynamic type of A is an extension', & ' of the dynamic type of MOLD.', & '', & ' o is_iostat_end(3) - Test for end-of-file value', & '', & ' o is_iostat_eor(3) - Test for end-of-record value', & '', & ' o present(3) - Determine whether an optional dummy argument is specified', & '', & ' o same_type_as(3) - Query dynamic types for equality', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 is_iostat_eor(3fortran)', & ''] shortname="is_iostat_eor" call process() case('138','kind') textblock=[character(len=256) :: & '', & 'kind(3fortran) kind(3fortran)', & '', & 'NAME', & ' KIND(3) - [KIND:INQUIRY] Query kind of an entity', & '', & 'SYNOPSIS', & ' result = kind(x)', & '', & ' integer function kind(x)', & '', & ' type(TYPE(kind=**)),intent(in) :: x(..)', & '', & 'CHARACTERISTICS', & ' o X may be of any intrinsic type. It may be a scalar or an array.', & '', & ' o the result is a default integer scalar', & '', & 'DESCRIPTION', & ' KIND(X)(3) returns the kind value of the entity X.', & '', & 'OPTIONS', & ' o X : Value to query the kind of.', & '', & 'RESULT', & ' The return value indicates the kind of the argument X.', & '', & ' Note that kinds are processor-dependent.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_kind', & ' implicit none', & ' integer,parameter :: dc = kind('' '')', & ' integer,parameter :: dl = kind(.true.)', & '', & ' print *, "The default character kind is ", dc', & ' print *, "The default logical kind is ", dl', & '', & ' end program demo_kind', & '', & ' Results:', & '', & ' > The default character kind is 1', & ' > The default logical kind is 4', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o ALLOCATED(3) - Status of an allocatable entity', & '', & ' o IS_CONTIGUOUS(3) - test if object is contiguous', & '', & ' o LBOUND(3) - Lower dimension bounds of an array', & '', & ' o RANK(3) - Rank of a data object', & '', & ' o SHAPE(3) - Determine the shape of an array', & '', & ' o SIZE(3) - Determine the size of an array', & '', & ' o UBOUND(3) - Upper dimension bounds of an array', & '', & ' o BIT_SIZE(3) - Bit size inquiry function', & '', & ' o STORAGE_SIZE(3) - Storage size in bits', & '', & ' o KIND(3) - Kind of an entity', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 kind(3fortran)', & ''] shortname="kind" call process() case('139','lbound') textblock=[character(len=256) :: & '', & 'lbound(3fortran) lbound(3fortran)', & '', & 'NAME', & ' LBOUND(3) - [ARRAY:INQUIRY] Lower dimension bounds of an array', & '', & 'SYNOPSIS', & ' result = lbound(array [,dim] [,kind] )', & '', & ' elemental TYPE(kind=KIND) function lbound(array,dim,kind)', & '', & ' TYPE(kind=KIND),intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' integer(kind=**),intent(in),optional :: kind', & '', & 'CHARACTERISTICS', & ' o ARRAY shall be assumed-rank or an array, of any type. It cannot be an', & ' unallocated allocatable array or a pointer that is not associated.', & '', & ' o DIM shall be a scalar integer. The corresponding actual argument shall', & ' not be an optional dummy argument, a disassociated pointer, or an', & ' unallocated allocatable.', & '', & ' o KIND an integer initialization expression indicating the kind parameter', & ' of the result.', & '', & ' o The return value is of type integer and of kind KIND. If KIND is absent,', & ' the return value is of default integer kind. The result is scalar if DIM', & ' is present; otherwise, the result is an array of rank one and size n,', & ' where n is the rank of ARRAY.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' LBOUND(3) returns the lower bounds of an array, or a single lower bound', & ' along the DIM dimension.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an array, of any type.', & '', & ' o DIM : Shall be a scalar integer. If DIM is absent, the result is an array', & ' of the upper bounds of ARRAY.', & '', & ' o KIND : An integer initialization expression indicating the kind parameter', & ' of the result.', & '', & 'RESULT', & ' If DIM is absent, the result is an array of the lower bounds of ARRAY.', & '', & ' If DIM is present, the result is a scalar corresponding to the lower bound', & ' of the array along that dimension. If ARRAY is an expression rather than a', & ' whole array or array structure component, or if it has a zero extent along', & ' the relevant dimension, the lower bound is taken to be', & '', & ' 1.', & '', & ' NOTE1', & '', & ' If ARRAY is assumed-rank and has rank zero, DIM cannot be present since it', & ' cannot satisfy the requirement 1 <= DIM <= 0.', & '', & 'EXAMPLES', & ' Note that this function should not be used on assumed-size arrays or in any', & ' function without an explicit interface. Errors can occur if there is no', & ' interface defined.', & '', & ' Sample program', & '', & ' ! program demo_lbound', & ' module m_bounds', & ' implicit none', & ' contains', & ' subroutine msub(arr)', & ' !!integer,intent(in) :: arr(*) ! cannot be assumed-size array', & ' integer,intent(in) :: arr(:)', & ' write(*,*)''MSUB: LOWER='',lbound(arr), &', & ' & ''UPPER='',ubound(arr), &', & ' & ''SIZE='',size(arr)', & ' end subroutine msub', & ' end module m_bounds', & '', & ' program demo_lbound', & ' use m_bounds, only : msub', & ' implicit none', & ' interface', & ' subroutine esub(arr)', & ' integer,intent(in) :: arr(:)', & ' end subroutine esub', & ' end interface', & ' integer :: arr(-10:10)', & ' write(*,*)''MAIN: LOWER='',lbound(arr), &', & ' & ''UPPER='',ubound(arr), &', & ' & ''SIZE='',size(arr)', & ' call csub()', & ' call msub(arr)', & ' call esub(arr)', & ' contains', & ' subroutine csub', & ' write(*,*)''CSUB: LOWER='',lbound(arr), &', & ' & ''UPPER='',ubound(arr), &', & ' & ''SIZE='',size(arr)', & ' end subroutine csub', & ' end', & '', & ' subroutine esub(arr)', & ' implicit none', & ' integer,intent(in) :: arr(:)', & ' ! WARNING: IF CALLED WITHOUT AN EXPLICIT INTERFACE', & ' ! THIS WILL GIVE UNDEFINED ANSWERS (like 0,0,0)', & ' write(*,*)''ESUB: LOWER='',lbound(arr), &', & ' & ''UPPER='',ubound(arr), &', & ' & ''SIZE='',size(arr)', & ' end subroutine esub', & '', & ' !end program demo_lbound', & '', & ' Results:', & '', & ' > MAIN: LOWER= -10 UPPER= 10 SIZE= 21', & ' > CSUB: LOWER= -10 UPPER= 10 SIZE= 21', & ' > MSUB: LOWER= 1 UPPER= 21 SIZE= 21', & ' > ESUB: LOWER= 1 UPPER= 21 SIZE= 21', & '', & 'STANDARD', & ' Fortran 95 , with KIND argument - Fortran 2003', & '', & 'SEE ALSO', & ' Array inquiry:', & '', & ' o SIZE(3) - Determine the size of an array', & '', & ' o RANK(3) - Rank of a data object', & '', & ' o SHAPE(3) - Determine the shape of an array', & '', & ' o UBOUND(3) - Upper dimension bounds of an array', & '', & ' CO_UBOUND(3), CO_LBOUND(3)', & '', & ' State Inquiry:', & '', & ' o ALLOCATED(3) - Status of an allocatable entity', & '', & ' o IS_CONTIGUOUS(3) - Test if object is contiguous', & '', & ' Kind Inquiry:', & '', & ' o KIND(3) - Kind of an entity', & '', & ' Bit Inquiry:', & '', & ' o STORAGE_SIZE(3) - Storage size in bits', & '', & ' o BIT_SIZE(3) - Bit size inquiry function', & '', & ' o BTEST(3) - Tests a bit of an integer value.', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 lbound(3fortran)', & ''] shortname="lbound" call process() case('140','lcobound') textblock=[character(len=256) :: & '', & 'lcobound(3fortran) lcobound(3fortran)', & '', & 'NAME', & ' LCOBOUND(3) - [COLLECTIVE] Lower codimension bounds of an array', & '', & 'SYNOPSIS', & ' result = lcobound( coarray [,dim] [,kind] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' LCOBOUND(3) returns the lower bounds of a coarray, or a single lower cobound', & ' along the DIM codimension.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an coarray, of any type.', & '', & ' o DIM : (Optional) Shall be a scalar integer.', & '', & ' o KIND : (Optional) An integer initialization expression indicating the', & ' kind parameter of the result.', & '', & 'RESULT', & ' The return value is of type integer and of kind KIND. If KIND is absent, the', & ' return value is of default integer kind. If DIM is absent, the result is an', & ' array of the lower cobounds of COARRAY. If DIM is present, the result is a', & ' scalar corresponding to the lower cobound of the array along that', & ' codimension.', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' UCOBOUND(3), LBOUND(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 lcobound(3fortran)', & ''] shortname="lcobound" call process() case('141','leadz') textblock=[character(len=256) :: & '', & 'leadz(3fortran) leadz(3fortran)', & '', & 'NAME', & ' LEADZ(3) - [BIT:COUNT] Number of leading zero bits of an integer', & '', & 'SYNOPSIS', & ' result = leadz(i)', & '', & ' elemental integer function leadz(i)', & '', & ' integer(kind=**),intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o I may be an integer of any kind.', & '', & ' o the return value is a default integer type.', & '', & 'DESCRIPTION', & ' LEADZ(3) returns the number of leading zero bits of an integer.', & '', & 'OPTIONS', & ' o I : integer to count the leading zero bits of.', & '', & 'RESULT', & ' The number of leading zero bits, taking into account the kind of the input', & ' value. If all the bits of I are zero, the result value is BIT_SIZE(I).', & '', & ' The result may also be thought of as BIT_SIZE(I)-1-K where K is the position', & ' of the leftmost 1 bit in the input I. Positions are from 0 to bit-size(),', & ' with 0 at the right-most bit.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_leadz', & ' implicit none', & ' integer :: value, i', & ' character(len=80) :: f', & '', & ' ! make a format statement for writing a value as a bit string', & ' write(f,''("(b",i0,".",i0,")")'')bit_size(value),bit_size(value)', & '', & ' ! show output for various integer values', & ' value=0', & ' do i=-150, 150, 50', & ' value=i', & ' write (*,''("LEADING ZERO BITS=",i3)'',advance=''no'') leadz(value)', & ' write (*,''(" OF VALUE ")'',advance=''no'')', & ' write(*,f,advance=''no'') value', & ' write(*,''(*(1x,g0))'') "AKA",value', & ' enddo', & ' ! Notes:', & ' ! for two''s-complements programming environments a negative non-zero', & ' ! integer value will always start with a 1 and a positive value with 0', & ' ! as the first bit is the sign bit. Such platforms are very common.', & ' end program demo_leadz', & '', & ' Results:', & '', & ' > LEADING ZERO BITS= 0 OF VALUE 11111111111111111111111101101010 AKA -150', & ' > LEADING ZERO BITS= 0 OF VALUE 11111111111111111111111110011100 AKA -100', & ' > LEADING ZERO BITS= 0 OF VALUE 11111111111111111111111111001110 AKA -50', & ' > LEADING ZERO BITS=32 OF VALUE 00000000000000000000000000000000 AKA 0', & ' > LEADING ZERO BITS=26 OF VALUE 00000000000000000000000000110010 AKA 50', & ' > LEADING ZERO BITS=25 OF VALUE 00000000000000000000000001100100 AKA 100', & ' > LEADING ZERO BITS=24 OF VALUE 00000000000000000000000010010110 AKA 150', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BIT_SIZE(3), POPCNT(3), POPPAR(3), TRAILZ(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 leadz(3fortran)', & ''] shortname="leadz" call process() case('142','len') textblock=[character(len=256) :: & '', & 'len(3fortran) len(3fortran)', & '', & 'NAME', & ' LEN(3) - [CHARACTER:INQUIRY] Length of a character entity', & '', & 'SYNOPSIS', & ' result = len(string [,kind])', & '', & ' integer(kind=KIND) function len(string,KIND)', & '', & ' character(len=*),intent(in) :: string(..)', & ' integer,optional,intent(in) :: KIND', & '', & 'CHARACTERISTICS', & ' o STRING is a scalar or array character variable', & '', & ' o KIND is a scalar integer constant expression.', & '', & ' o the returned value is the same integer kind as the KIND argument, or of', & ' the default integer kind if KIND is not specified.', & '', & 'DESCRIPTION', & ' LEN(3) returns the length of a character string.', & '', & ' If STRING is an array, the length of a single element of STRING is returned,', & ' as all elements of an array are the same length.', & '', & ' Note that STRING need not be defined when this intrinsic is invoked, as only', & ' the length (not the content) of STRING is needed.', & '', & 'OPTIONS', & ' o STRING : A scalar or array string to return the length of. If it is an', & ' unallocated allocatable variable or a pointer that is not associated, its', & ' length type parameter shall not be deferred.', & '', & ' o KIND : A constant indicating the kind parameter of the result.', & '', & 'RESULT', & ' The result has a value equal to the number of characters in STRING if it is', & ' scalar or in an element of STRING if it is an array.', & '', & 'EXAMPLES', & ' Sample program', & '', & ' program demo_len', & ' implicit none', & '', & ' ! fixed length', & ' character(len=40) :: string', & ' ! allocatable length', & ' character(len=:),allocatable :: astring', & ' character(len=:),allocatable :: many_strings(:)', & ' integer :: ii', & ' ! BASIC USAGE', & ' ii=len(string)', & ' write(*,*)''length ='',ii', & '', & ' ! ALLOCATABLE VARIABLE LENGTH CAN CHANGE', & ' ! the allocatable string length will be the length of RHS expression', & ' astring='' How long is this allocatable string? ''', & ' write(*,*)astring, '' LEN='', len(astring)', & ' ! print underline', & ' write(*,*) repeat(''='',len(astring))', & ' ! assign new value to astring and length changes', & ' astring=''New allocatable string''', & ' write(*,*)astring, '' LEN='', len(astring)', & ' ! print underline', & ' write(*,*) repeat(''='',len(astring))', & '', & ' ! THE STRING LENGTH WILL BE CONSTANT FOR A FIXED-LENGTH VARIABLE', & ' string='' How long is this fixed string? ''', & ' write(*,*)string,'' LEN='',len(string)', & ' string=''New fixed string ''', & ' write(*,*)string,'' LEN='',len(string)', & '', & ' ! ALL STRINGS IN AN ARRAY ARE THE SAME LENGTH', & ' ! a scalar is returned for an array, as all values in a Fortran', & ' ! character array must be of the same length.', & ' many_strings = [ character(len=7) :: ''Tom'', ''Dick'', ''Harry'' ]', & ' write(*,*)''length of ALL elements of array='',len(many_strings)', & '', & ' ! NAME%LEN IS ESSENTIALLY THE SAME AS LEN(NAME)', & ' ! you can also query the length (and other attributes) of a string', & ' ! using a "type parameter inquiry" (available since fortran 2018)', & ' write(*,*)''length from type parameter inquiry='',string%len', & ' ! %len is equivalent to a call to LEN() except the kind of the integer', & ' ! value returned is always of default kind.', & '', & ' ! LOOK AT HOW A PASSED STRING CAN BE USED ...', & ' call passed('' how long? '')', & '', & ' contains', & '', & ' subroutine passed(str)', & ' character(len=*),intent(in) :: str', & ' ! the length of str can be used in the definitions of variables', & ' ! you can query the length of the passed variable', & ' write(*,*)''length of passed value is '', LEN(str)', & ' end subroutine passed', & '', & ' end program demo_len', & '', & ' Results:', & '', & ' > length = 40', & ' > How long is this allocatable string? LEN= 38', & ' > ======================================', & ' > New allocatable string LEN= 22', & ' > ======================', & ' > How long is this fixed string? LEN= 40', & ' > New fixed string LEN= 40', & ' > length of ALL elements of array= 7', & ' > length from type parameter inquiry= 40', & ' > length of passed value is 11', & '', & 'STANDARD', & ' FORTRAN 77 ; with KIND argument - Fortran 2003', & '', & 'SEE ALSO', & ' len_trim(3), adjustr(3), trim(3), and adjustl(3) are related routines that', & ' allow you to deal with leading and trailing blanks.', & '', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 len(3fortran)', & ''] shortname="len" call process() case('143','len_trim') textblock=[character(len=256) :: & '', & 'len_trim(3fortran) len_trim(3fortran)', & '', & 'NAME', & ' LEN_TRIM(3) - [CHARACTER:INQUIRY] Character length without trailing blank', & ' characters', & '', & 'SYNOPSIS', & ' result = len_trim(string [,kind])', & '', & ' elemental integer(kind=KIND) function len_trim(string,KIND)', & '', & ' character(len=*),intent(in) :: string', & ' integer(kind=KIND),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o STRING is of type character', & '', & ' o KIND is a scalar integer constant expression specifying the kind of the', & ' returned value.', & '', & ' o The return value is of type integer and of kind KIND. If KIND is absent,', & ' the return value is of default integer kind.', & '', & 'DESCRIPTION', & ' LEN_TRIM(3) returns the length of a character string, ignoring any trailing', & ' blanks.', & '', & 'OPTIONS', & ' o STRING : The input string whose length is to be measured.', & '', & ' o KIND : Indicates the kind parameter of the result.', & '', & 'RESULT', & ' The result equals the number of characters remaining after any trailing', & ' blanks in STRING are removed.', & '', & ' If the input argument is of zero length or all blanks the result is zero.', & '', & 'EXAMPLES', & ' Sample program', & '', & ' program demo_len_trim', & ' implicit none', & ' character(len=:),allocatable :: string', & ' integer :: i', & ' ! basic usage', & ' string=" how long is this string? "', & ' write(*,*) string', & ' write(*,*)''UNTRIMMED LENGTH='',len(string)', & ' write(*,*)''TRIMMED LENGTH='',len_trim(string)', & '', & ' ! print string, then print substring of string', & ' string=''xxxxx ''', & ' write(*,*)string,string,string', & ' i=len_trim(string)', & ' write(*,*)string(:i),string(:i),string(:i)', & ' !', & ' ! elemental example', & ' ELE:block', & ' ! an array of strings may be used', & ' character(len=:),allocatable :: tablet(:)', & ' tablet=[character(len=256) :: &', & ' & '' how long is this string? '',&', & ' & ''and this one?'']', & ' write(*,*)''UNTRIMMED LENGTH= '',len(tablet)', & ' write(*,*)''TRIMMED LENGTH= '',len_trim(tablet)', & ' write(*,*)''SUM TRIMMED LENGTH='',sum(len_trim(tablet))', & ' endblock ELE', & ' !', & ' end program demo_len_trim', & '', & ' Results:', & '', & ' > how long is this string?', & ' > UNTRIMMED LENGTH= 30', & ' > TRIMMED LENGTH= 25', & ' > xxxxx xxxxx xxxxx', & ' > xxxxxxxxxxxxxxx', & ' > UNTRIMMED LENGTH= 256', & ' > TRIMMED LENGTH= 25 13', & ' > SUM TRIMMED LENGTH= 38', & '', & 'STANDARD', & ' Fortran 95 . KIND argument added with Fortran 2003.', & '', & 'SEE ALSO', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: REPEAT(3), LEN(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 len_trim(3fortran)', & ''] shortname="len_trim" call process() case('144','lge') textblock=[character(len=256) :: & '', & 'lge(3fortran) lge(3fortran)', & '', & 'NAME', & ' LGE(3) - [CHARACTER:COMPARE] ASCII Lexical greater than or equal', & '', & 'SYNOPSIS', & ' result = lge(string_a, stringb)', & '', & ' elemental logical function lge(string_a, string_b)', & '', & ' character(len=*),intent(in) :: string_a', & ' character(len=*),intent(in) :: string_b', & '', & 'CHARACTERISTICS', & ' o STRING_A is default character or an ASCII character string', & '', & ' o STRING_B is the same type and kind as STRING_A', & '', & ' o the result is a default logical', & '', & 'DESCRIPTION', & ' LGE(3) determines whether one string is lexically greater than or equal to', & ' another string, where the two strings are interpreted as containing ASCII', & ' character codes. If STRING_A and STRING_B are not the same length, the', & ' shorter is compared as if spaces were appended to it to form a value that', & ' has the same length as the longer.', & '', & ' The lexical comparison intrinsics LGE(3), LGT(3), LLE(3), and LLT(3) differ', & ' from the corresponding intrinsic operators .ge., .gt., .le., and .lt., in', & ' that the latter use the processor''s character ordering (which is not ASCII', & ' on some targets), whereas the former always use the ASCII ordering.', & '', & 'OPTIONS', & ' o STRING_A : string to be tested', & '', & ' o STRING_B : string to compare to STRING_A', & '', & 'RESULT', & ' Returns .true. if string_a >= string_b, and .false. otherwise, based on the', & ' ASCII collating sequence.', & '', & ' If both input arguments are null strings, .true. is always returned.', & '', & ' If either string contains a character not in the ASCII character set, the', & ' result is processor dependent.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_lge', & ' implicit none', & ' integer :: i', & ' print *,''the ASCII collating sequence for printable characters''', & ' write(*,''(1x,19a)'')(char(i),i=32,126) ! ASCII order', & ' write(*,*) lge(''abc'',''ABC'') ! [T] lowercase is > uppercase', & ' write(*,*) lge(''abc'',''abc '') ! [T] trailing spaces', & ' ! If both strings are of zero length the result is true', & ' write(*,*) lge('''','''') ! [T]', & ' write(*,*) lge('''',''a'') ! [F] the null string is padded', & ' write(*,*) lge(''a'','''') ! [T]', & ' ! elemental', & ' write(*,*) lge(''abc'',[''abc'',''123'']) ! [T T] scalar and array', & ' write(*,*) lge([''cba'', ''123''],''abc'') ! [T F]', & ' write(*,*) lge([''abc'',''123''],[''cba'',''123'']) ! [F T] both arrays', & ' end program demo_lge', & '', & ' Results:', & '', & ' > the ASCII collating sequence for printable characters', & ' > !"#$%&''()*+,-./012', & ' > 3456789:;<=>?@ABCDE', & ' > FGHIJKLMNOPQRSTUVWX', & ' > YZ[\]^_`abcdefghijk', & ' > lmnopqrstuvwxyz{|}~', & ' > T', & ' > T', & ' > T', & ' > F', & ' > T', & ' > T T', & ' > T F', & ' > F T', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' LGT(3), LLE(3), LLT(3)', & '', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3),', & '', & ' SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 lge(3fortran)', & ''] shortname="lge" call process() case('145','lgt') textblock=[character(len=256) :: & '', & 'lgt(3fortran) lgt(3fortran)', & '', & 'NAME', & ' LGT(3) - [CHARACTER:COMPARE] ASCII Lexical greater than', & '', & 'SYNOPSIS', & ' result = lgt(string_a, string_b)', & '', & ' elemental logical function lgt(string_a, string_b)', & '', & ' character(len=*),intent(in) :: string_a', & ' character(len=*),intent(in) :: string_b', & '', & 'CHARACTERISTICS', & ' o STRING_A is default character or an ASCII character string', & '', & ' o STRING_B is the same type and kind as STRING_A', & '', & ' o the result is a default logical', & '', & 'DESCRIPTION', & ' LGT(3) determines whether one string is lexically greater than another', & ' string, where the two strings are interpreted as containing ASCII character', & ' codes. If the String A and String B are not the same length, the shorter is', & ' compared as if spaces were appended to it to form a value that has the same', & ' length as the longer.', & '', & ' In general, the lexical comparison intrinsics LGE, LGT, LLE, and LLT differ', & ' from the corresponding intrinsic operators .ge., .gt., .le., and .lt., in', & ' that the latter use the processor''s character ordering (which is not ASCII', & ' on some targets), whereas the former always use the ASCII ordering.', & '', & 'OPTIONS', & ' o STRING_A : string to be tested', & '', & ' o STRING_B : string to compare to STRING_A', & '', & 'RESULT', & ' Returns .true. if string_a > string_b, and .false. otherwise, based on the', & ' ASCII ordering.', & '', & ' If both input arguments are null strings, .false. is returned.', & '', & ' If either string contains a character not in the ASCII character set, the', & ' result is processor dependent.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_lgt', & ' implicit none', & ' integer :: i', & ' print *,''the ASCII collating sequence for printable characters''', & ' write(*,''(1x,19a)'')(char(i),i=32,126)', & '', & ' write(*,*) lgt(''abc'',''ABC'') ! [T] lowercase is > uppercase', & ' write(*,*) lgt(''abc'',''abc '') ! [F] trailing spaces', & '', & ' ! If both strings are of zero length the result is false.', & ' write(*,*) lgt('''','''') ! [F]', & ' write(*,*) lgt('''',''a'') ! [F] the null string is padded', & ' write(*,*) lgt(''a'','''') ! [T]', & ' write(*,*) lgt(''abc'',[''abc'',''123'']) ! [F T] scalar and array', & ' write(*,*) lgt([''cba'', ''123''],''abc'') ! [T F]', & ' write(*,*) lgt([''abc'',''123''],[''cba'',''123'']) ! [F F] both arrays', & ' end program demo_lgt', & '', & ' Results:', & '', & ' > the ASCII collating sequence for printable characters', & ' > !"#$%&''()*+,-./012', & ' > 3456789:;<=>?@ABCDE', & ' > FGHIJKLMNOPQRSTUVWX', & ' > YZ[\]^_`abcdefghijk', & ' > lmnopqrstuvwxyz{|}~', & ' > T', & ' > F', & ' > F', & ' > F', & ' > T', & ' > F T', & ' > T F', & ' > F F', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' LGE(3), LLE(3), LLT(3)', & '', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3),', & '', & ' SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 lgt(3fortran)', & ''] shortname="lgt" call process() case('146','lle') textblock=[character(len=256) :: & '', & 'lle(3fortran) lle(3fortran)', & '', & 'NAME', & ' LLE(3) - [CHARACTER:COMPARE] ASCII Lexical less than or equal', & '', & 'SYNOPSIS', & ' result = lle(string_a, stringb)', & '', & ' elemental logical function lle(string_a, string_b)', & '', & ' character(len=*),intent(in) :: string_a', & ' character(len=*),intent(in) :: string_b', & '', & 'CHARACTERISTICS', & ' o STRING_A is default character or an ASCII character string', & '', & ' o STRING_B is the same type and kind as STRING_A', & '', & ' o the result is a default logical', & '', & 'DESCRIPTION', & ' LLE(3) determines whether one string is lexically less than or equal to', & ' another string, where the two strings are interpreted as containing ASCII', & ' character codes.', & '', & ' If STRING_A and STRING_B are not the same length, the shorter is compared as', & ' if spaces were appended to it to form a value that has the same length as', & ' the longer.', & '', & ' Leading spaces are significant.', & '', & ' In general, the lexical comparison intrinsics LGE, LGT, LLE, and LLT differ', & ' from the corresponding intrinsic operators .ge., .gt., .le., and .lt., in', & ' that the latter use the processor''s character ordering (which is not ASCII', & ' on some targets), whereas LLE(3) always uses the ASCII ordering.', & '', & 'OPTIONS', & ' o STRING_A : string to be tested', & '', & ' o STRING_B : string to compare to STRING_A', & '', & 'RESULT', & ' Returns .true. if STRING_A <= STRING_B, and .false. otherwise, based on the', & ' ASCII collating sequence.', & '', & ' If both input arguments are null strings, .true. is always returned.', & '', & ' If either string contains a character not in the ASCII character set, the', & ' result is processor dependent.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_lle', & ' implicit none', & ' integer :: i', & ' print *,''the ASCII collating sequence for printable characters''', & ' write(*,''(1x,19a)'')(char(i),i=32,126)', & ' ! basics', & '', & ' print *,''case matters''', & ' write(*,*) lle(''abc'',''ABC'') ! F lowercase is > uppercase', & '', & ' print *,''a space is the lowest printable character''', & ' write(*,*) lle(''abcd'',''abc'') ! F d > space', & ' write(*,*) lle(''abc'',''abcd'') ! T space < d', & '', & ' print *,''leading spaces matter, trailing spaces do not''', & ' write(*,*) lle(''abc'',''abc '') ! T trailing spaces', & ' write(*,*) lle(''abc'','' abc'') ! F leading spaces are significant', & '', & ' print *,''even null strings are padded and compared''', & ' ! If both strings are of zero length the result is true.', & ' write(*,*) lle('''','''') ! T', & ' write(*,*) lle('''',''a'') ! T the null string is padded', & ' write(*,*) lle(''a'','''') ! F', & ' print *,''elemental''', & ' write(*,*) lle(''abc'',[''abc'',''123'']) ! [T,F] scalar and array', & ' write(*,*) lle([''cba'', ''123''],''abc'') ! [F,T]', & ' ! per the rules for elemental procedures arrays must be the same size', & ' write(*,*) lle([''abc'',''123''],[''cba'',''123'']) ! [T,T] both arrays', & ' end program demo_lle', & '', & ' Results:', & '', & ' > the ASCII collating sequence for printable characters', & ' > !"#$%&''()*+,-./012', & ' > 3456789:;<=>?@ABCDE', & ' > FGHIJKLMNOPQRSTUVWX', & ' > YZ[\]^_`abcdefghijk', & ' > lmnopqrstuvwxyz{|}~', & ' > case matters', & ' > F', & ' > a space is the lowest printable character', & ' > F', & ' > T', & ' > leading spaces matter, trailing spaces do not', & ' > T', & ' > F', & ' > even null strings are padded and compared', & ' > T', & ' > T', & ' > F', & ' > elemental', & ' > T F', & ' > F T', & ' > T T', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' LGE(3), LGT(3), LLT(3)', & '', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3),', & '', & ' SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 lle(3fortran)', & ''] shortname="lle" call process() case('147','llt') textblock=[character(len=256) :: & '', & 'llt(3fortran) llt(3fortran)', & '', & 'NAME', & ' LLT(3) - [CHARACTER:COMPARE] ASCII Lexical less than', & '', & 'SYNOPSIS', & ' result = llt(string_a, stringb)', & '', & ' elemental logical function llt(string_a, string_b)', & '', & ' character(len=*),intent(in) :: string_a', & ' character(len=*),intent(in) :: string_b', & '', & 'CHARACTERISTICS', & ' o STRING_A is default character or an ASCII character string', & '', & ' o STRING_B is the same type and kind as STRING_A', & '', & ' o the result is a default logical', & '', & 'DESCRIPTION', & ' LLT(3) determines whether one string is lexically less than another string,', & ' where the two strings are interpreted as containing ASCII character codes.', & ' If the STRING_A and STRING_B are not the same length, the shorter is', & ' compared as if spaces were appended to it to form a value that has the same', & ' length as the longer.', & '', & ' In general, the lexical comparison intrinsics LGE, LGT, LLE, and LLT differ', & ' from the corresponding intrinsic operators .ge., .gt., .le., and .lt., in', & ' that the latter use the processor''s character ordering (which is not ASCII', & ' on some targets), whereas the former always use the ASCII ordering.', & '', & 'OPTIONS', & ' o STRING_A : string to be tested', & '', & ' o STRING_B : string to compare to STRING_A', & '', & 'RESULT', & ' Returns .true. if string_a < string_b, and .false. otherwise, based on the', & ' ASCII collating sequence.', & '', & ' If both input arguments are null strings, .false. is always returned.', & '', & ' If either string contains a character not in the ASCII character set, the', & ' result is processor dependent.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_llt', & ' implicit none', & ' integer :: i', & '', & ' print *,''the ASCII collating sequence for printable characters''', & ' write(*,''(1x,19a)'')(char(i),i=32,126) ! ASCII order', & '', & ' ! basics', & ' print *,''case matters''', & ' write(*,*) llt(''abc'',''ABC'') ! [F] lowercase is > uppercase', & ' write(*,*) llt(''abc'',''abc '') ! [F] trailing spaces', & ' ! If both strings are of zero length the result is false.', & ' write(*,*) llt('''','''') ! [F]', & ' write(*,*) llt('''',''a'') ! [T] the null string is padded', & ' write(*,*) llt(''a'','''') ! [F]', & ' print *,''elemental''', & ' write(*,*) llt(''abc'',[''abc'',''123'']) ! [F F] scalar and array', & ' write(*,*) llt([''cba'', ''123''],''abc'') ! [F T]', & ' write(*,*) llt([''abc'',''123''],[''cba'',''123'']) ! [T F] both arrays', & ' end program demo_llt', & '', & ' Results:', & '', & ' > the ASCII collating sequence for printable characters', & ' > !"#$%&''()*+,-./012', & ' > 3456789:;<=>?@ABCDE', & ' > FGHIJKLMNOPQRSTUVWX', & ' > YZ[\]^_`abcdefghijk', & ' > lmnopqrstuvwxyz{|}~', & ' > case matters', & ' > F', & ' > F', & ' > F', & ' > T', & ' > F', & ' > elemental', & ' > F F', & ' > F T', & ' > T F', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' LGE(3), LGT(3), LLE(3))', & '', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 llt(3fortran)', & ''] shortname="llt" call process() case('148','log10') textblock=[character(len=256) :: & '', & 'log10(3fortran) log10(3fortran)', & '', & 'NAME', & ' LOG10(3) - [MATHEMATICS] Base 10 or common logarithm', & '', & 'SYNOPSIS', & ' result = log10(x)', & '', & ' elemental real(kind=KIND) function log10(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X may be any kind of real value', & '', & ' o the result is the same type and characteristics as X.', & '', & 'DESCRIPTION', & ' LOG10(3) computes the base 10 logarithm of X. This is generally called the', & ' "common logarithm".', & '', & 'OPTIONS', & ' o X : A real value > 0 to take the log of.', & '', & 'RESULT', & ' The logarithm to base 10 of X', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_log10', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 10.0_real64', & '', & ' x = log10(x)', & ' write(*,''(*(g0))'')''log10('',x,'') is '',log10(x)', & '', & ' ! elemental', & ' write(*, *)log10([1.0, 10.0, 100.0, 1000.0, 10000.0, &', & ' & 100000.0, 1000000.0, 10000000.0])', & '', & ' end program demo_log10', & '', & ' Results:', & '', & ' > log10(1.000000000000000) is .000000000000000', & ' > 0.0000000E+00 1.000000 2.000000 3.000000 4.000000', & ' > 5.000000 6.000000 7.000000', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o exp(3) - Base-e exponential function', & '', & ' o gamma(3) - Gamma function, which yields factorials for positive whole', & ' numbers', & '', & ' o hypot(3) - Returns the Euclidean distance - the distance between a point', & ' and the origin.', & '', & ' o log(3) - Natural logarithm', & '', & ' o log_gamma(3) - Logarithm of the absolute value of the Gamma function', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 log10(3fortran)', & ''] shortname="log10" call process() case('149','log') textblock=[character(len=256) :: & '', & 'log(3fortran) log(3fortran)', & '', & 'NAME', & ' LOG(3) - [MATHEMATICS] Natural logarithm', & '', & 'SYNOPSIS', & ' result = log(x)', & '', & ' elemental TYPE(kind=KIND) function log(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X may be any real or complex kind.', & '', & ' o the result is the same type and characteristics as X.', & '', & 'DESCRIPTION', & ' LOG(3) computes the natural logarithm of X, i.e. the logarithm to the base', & ' "e".', & '', & 'OPTIONS', & ' o X : The value to compute the natural log of. If X is real, its value', & ' shall be greater than zero. If X is complex, its value shall not be zero.', & '', & 'RESULT', & ' The natural logarithm of X. If X is the complex value (R,I) , the imaginary', & ' part "i" is in the range', & '', & ' -PI < i <= PI', & '', & ' If the real part of X is less than zero and the imaginary part of X is zero,', & ' then the imaginary part of the result is approximately PI if the imaginary', & ' part of PI is positive real zero or the processor does not distinguish', & ' between positive and negative real zero, and approximately -PI if the', & ' imaginary part of X is negative real zero.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_log', & ' implicit none', & ' real(kind(0.0d0)) :: x = 2.71828182845904518d0', & ' complex :: z = (1.0, 2.0)', & ' write(*,*)x, log(x) ! will yield (approximately) 1', & ' write(*,*)z, log(z)', & ' end program demo_log', & '', & ' Results:', & '', & ' > 2.7182818284590451 1.0000000000000000', & ' > (1.00000000,2.00000000) (0.804718971,1.10714877)', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o log10(3) - Base 10 or common logarithm', & '', & ' o exp(3) - Base-e exponential function', & '', & ' o hypot(3) - Returns the Euclidean distance - the distance between a point', & ' and the origin.', & '', & ' o gamma(3) - Gamma function, which yields factorials for positive whole', & ' numbers', & '', & ' o log_gamma(3) - Logarithm of the absolute value of the Gamma function', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 log(3fortran)', & ''] shortname="log" call process() case('150','log_gamma') textblock=[character(len=256) :: & '', & 'log_gamma(3fortran) log_gamma(3fortran)', & '', & 'NAME', & ' LOG_GAMMA(3) - [MATHEMATICS] Logarithm of the absolute value of the Gamma', & ' function', & '', & 'SYNOPSIS', & ' result = log_gamma(x)', & '', & ' elemental real(kind=KIND) function log_gamma(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X may be any real type', & '', & ' o the return value is of same type and kind as X.', & '', & 'DESCRIPTION', & ' LOG_GAMMA(3) computes the natural logarithm of the absolute value of the', & ' Gamma function.', & '', & 'OPTIONS', & ' o X : neither negative nor zero value to render the result for.', & '', & 'RESULT', & ' The result has a value equal to a processor-dependent approximation to the', & ' natural logarithm of the absolute value of the gamma function of X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_log_gamma', & ' implicit none', & ' real :: x = 1.0', & ' write(*,*)x,log_gamma(x) ! returns 0.0', & ' write(*,*)x,log_gamma(3.0) ! returns 0.693 (approximately)', & ' end program demo_log_gamma', & '', & ' Results:', & '', & ' > 1.000000 0.0000000E+00', & ' > 1.000000 0.6931472', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' Gamma function: GAMMA(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 log_gamma(3fortran)', & ''] shortname="log_gamma" call process() case('151','logical') textblock=[character(len=256) :: & '', & 'logical(3fortran) logical(3fortran)', & '', & 'NAME', & ' LOGICAL(3) - [TYPE:CONVERSION] Conversion between kinds of logical values', & '', & 'SYNOPSIS', & ' result = logical(l [,kind])', & '', & ' elemental logical(kind=KIND) function logical(l,KIND)', & '', & ' logical(kind=**),intent(in) :: l', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o L is of type logical', & '', & ' o KIND shall be a scalar integer constant expression. If KIND is present,', & ' the kind type parameter of the result is that specified by the value of', & ' KIND; otherwise, the kind type parameter is that of default logical.', & '', & 'DESCRIPTION', & ' LOGICAL(3) converts one kind of logical variable to another.', & '', & 'OPTIONS', & ' o L : The logical value to produce a copy of with kind KIND', & '', & ' o KIND : indicates the kind parameter of the result. If not present, the', & ' default kind is returned.', & '', & 'RESULT', & ' The return value is a logical value equal to L, with a kind corresponding to', & ' KIND, or of the default logical kind if KIND is not given.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_logical', & ' use iso_fortran_env, only : logical_kinds', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' use,intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' character(len=*),parameter :: g=''(*(g0))''', & ' integer :: i, i1, i2', & ' logical :: l1, l2', & ' !', & ' ! list kind values supported on this platform', & ' !', & ' do i =1, size(logical_kinds)', & ' write(*,''(*(g0))'')''integer,parameter :: boolean'', &', & ' & logical_kinds(i),''='', logical_kinds(i)', & ' enddo', & ' ! for performance and storage purposes you generally want', & ' ! to use the smallest storage size supported when using', & ' ! large arrays, but some existing routines may require', & ' ! the default kind. LOGICAL(3f) can change the kind of', & ' ! the variables.', & ' !', & ' ! But converting a logical to an integer is not done', & ' ! with LOGICAL(3f); but can be down with MERGE(3f).', & ' !', & ' l1=.true.', & ' l2=.false.', & ' i1=merge(0,1,l1)', & ' i2=merge(0,1,l2)', & ' write(*,g)''L1='',l1,'' L2='',l2,'' I1='',i1,'' I2='',i2', & ' !', & ' ! show type and kind of default logicals', & ' call showme(.true.)', & ' call showme(l1)', & ' ! show logical() changing type and kind', & ' call showme(logical(l1))', & ' ! you may have to delete unsupported kinds from this example', & '', & ' ! this is probably the default', & ' call showme(logical(l1,kind=4))', & ' ! note how showme shows different kinds are being passed to it', & ' call showme(logical(l1,kind=8))', & ' call showme(logical(l1,kind=2))', & ' ! this is probably the smallest storage size supported', & ' ! on this platform; but kind values are platform-specific', & ' call showme(logical(l1,kind=1))', & ' contains', & ' subroutine showme(val)', & ' ! @(#) showme(3f) - display type and kind of intrinsic value', & ' class(*),intent(in) :: val', & ' select type(val)', & ' type is (integer(kind=int8))', & ' write(*,''("integer(kind=int8) ",i0)'') val', & ' type is (integer(kind=int16))', & ' write(*,''("integer(kind=int16) ",i0)'') val', & ' type is (integer(kind=int32))', & ' write(*,''("integer(kind=int32) ",i0)'') val', & ' type is (integer(kind=int64))', & ' write(*,''("integer(kind=int64) ",i0)'') val', & ' type is (real(kind=real32))', & ' write(*,''("real(kind=real32) ",1pg0)'') val', & ' type is (real(kind=real64))', & ' write(*,''("real(kind=real64) ",1pg0)'') val', & ' type is (real(kind=real128))', & ' write(*,''("real(kind=real128) ",1pg0)'') val', & ' type is (logical(kind=1))', & ' write(*,''("logical(kind=1) ",l1,a,i0)'') val, &', & ' & ''storage='',storage_size(val)', & ' type is (logical(kind=2))', & ' write(*,''("logical(kind=2) ",l1,a,i0)'') val, &', & ' & ''storage='',storage_size(val)', & ' type is (logical(kind=4))', & ' write(*,''("logical(kind=4) ",l1,a,i0)'') val, &', & ' & ''storage='',storage_size(val)', & ' type is (logical(kind=8))', & ' write(*,''("logical(kind=8) ",l1,a,i0)'') val, &', & ' & ''storage='',storage_size(val)', & ' type is (character(len=*))', & ' write(*,''("character ",a)'') trim(val)', & ' type is (complex)', & ' write(*,''("","(",1pg0,",",1pg0,")")'') val', & ' class default', & ' stop ''crud. showme() does not know about this type''', & ' end select', & ' end subroutine showme', & ' end program demo_logical', & '', & ' Results:', & '', & ' > integer,parameter :: boolean1=1', & ' > integer,parameter :: boolean2=2', & ' > integer,parameter :: boolean4=4', & ' > integer,parameter :: boolean8=8', & ' > integer,parameter :: boolean16=16', & ' > L1=T L2=F I1=0 I2=1', & ' > logical(kind=4) Tstorage=32', & ' > logical(kind=4) Tstorage=32', & ' > logical(kind=4) Tstorage=32', & ' > logical(kind=1) Tstorage=8', & ' > logical(kind=2) Tstorage=16', & ' > logical(kind=4) Tstorage=32', & '', & 'STANDARD', & ' Fortran 95 , related ISO_FORTRAN_ENV module - fortran 2009', & '', & 'SEE ALSO', & ' o AIMAG(3) - Imaginary part of complex number', & '', & ' o CMPLX(3) - Conversion to a complex type', & '', & ' o DBLE(3) - Converstion to double precision real', & '', & ' o INT(3) - Truncate towards zero and convert to integer', & '', & ' o NINT(3) - Nearest whole number', & '', & ' o REAL(3) - Convert to real type', & '', & ' o OUT_OF_RANGE(3) - Whether a numeric value can be converted safely to', & ' another type', & '', & ' o TRANSFER(3) - Transfer bit patterns', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 logical(3fortran)', & ''] shortname="logical" call process() case('152','maskl') textblock=[character(len=256) :: & '', & 'maskl(3fortran) maskl(3fortran)', & '', & 'NAME', & ' MASKL(3) - [BIT:SET] Generates a left justified mask', & '', & 'SYNOPSIS', & ' result = maskl( i [,kind] )', & '', & ' elemental integer(kind=KIND) function maskl(i,KIND)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o I is an integer', & '', & ' o KIND Shall be a scalar constant expression of type integer whose value is', & ' a supported integer kind.', & '', & ' o The result is an integer of the same kind as I unless KIND is present,', & ' which is then used to specify the kind of the result.', & '', & 'DESCRIPTION', & ' MASKL(3) has its leftmost I bits set to 1, and the remaining bits set to', & '', & ' 0.', & '', & 'OPTIONS', & ' o I : the number of left-most bits to set in the integer result. It must be', & ' from 0 to the number of bits for the kind of the result. The default kind', & ' of the result is the same as I unless the result size is specified by', & ' KIND. That is, these Fortran statements must be .true. :', & '', & ' i >= 0 .and. i < bitsize(i) ! if KIND is not specified', & ' i >= 0 .and. i < bitsize(0_KIND) ! if KIND is specified', & '', & ' o KIND : designates the kind of the integer result.', & '', & 'RESULT', & ' The leftmost I bits of the output integer are set to 1 and the other bits', & ' are set to 0.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_maskl', & ' implicit none', & ' integer :: i', & ' ! basics', & ' i=3', & ' write(*,''(i0,1x,b0)'') i, maskl(i)', & '', & ' ! elemental', & ' write(*,''(*(i11,1x,b0.32,1x,/))'') maskl([(i,i,i=0,bit_size(0),4)])', & ' end program demo_maskl', & '', & ' Results:', & '', & ' > 3 11100000000000000000000000000000', & ' > 0 00000000000000000000000000000000', & ' > -268435456 11110000000000000000000000000000', & ' > -16777216 11111111000000000000000000000000', & ' > -1048576 11111111111100000000000000000000', & ' > -65536 11111111111111110000000000000000', & ' > -4096 11111111111111111111000000000000', & ' > -256 11111111111111111111111100000000', & ' > -16 11111111111111111111111111110000', & ' > -1 11111111111111111111111111111111', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' MASKR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 maskl(3fortran)', & ''] shortname="maskl" call process() case('153','maskr') textblock=[character(len=256) :: & '', & 'maskr(3fortran) maskr(3fortran)', & '', & 'NAME', & ' MASKR(3) - [BIT:SET] Generates a right-justified mask', & '', & 'SYNOPSIS', & ' result = maskr( i [,kind] )', & '', & ' elemental integer(kind=KIND) function maskr(i,KIND)', & '', & ' integer(kind=**),intent(in) :: i', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o I is an integer', & '', & ' o KIND Shall be a scalar constant expression of type integer whose value is', & ' a supported integer kind.', & '', & ' o The result is an integer of the same kind as I unless KIND is present,', & ' which is then used to specify the kind of the result.', & '', & 'DESCRIPTION', & ' MASKR(3) generates an integer with its rightmost I bits set to 1, and the', & ' remaining bits set to 0.', & '', & 'OPTIONS', & ' o I : the number of right-most bits to set in the integer result. It must', & ' be from 0 to the number of bits for the kind of the result. The default', & ' kind of the result is the same as I unless the result size is specified', & ' by KIND. That is, these Fortran statements must be .true. :', & '', & ' i >= 0 .and. i < bitsize(i) ! if KIND is not specified', & ' i >= 0 .and. i < bitsize(0_KIND) ! if KIND is specified', & '', & ' o KIND : designates the kind of the integer result.', & '', & 'RESULT', & ' The rightmost I bits of the output integer are set to 1 and the other bits', & ' are set to 0.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_maskr', & ' implicit none', & ' integer :: i', & '', & ' ! basics', & ' print *,''basics''', & ' write(*,''(i0,t5,b32.32)'') 1, maskr(1)', & ' write(*,''(i0,t5,b32.32)'') 5, maskr(5)', & ' write(*,''(i0,t5,b32.32)'') 11, maskr(11)', & ' print *,"should be equivalent on two''s-complement processors"', & ' write(*,''(i0,t5,b32.32)'') 1, shiftr(-1,bit_size(0)-1)', & ' write(*,''(i0,t5,b32.32)'') 5, shiftr(-1,bit_size(0)-5)', & ' write(*,''(i0,t5,b32.32)'') 11, shiftr(-1,bit_size(0)-11)', & '', & ' ! elemental', & ' print *,''elemental ''', & ' print *,''(array argument accepted like called with each element)''', & ' write(*,''(*(i11,1x,b0.32,1x,/))'') maskr([(i,i,i=0,bit_size(0),4)])', & '', & ' end program demo_maskr', & '', & ' Results:', & '', & ' > basics', & ' > 1 00000000000000000000000000000001', & ' > 5 00000000000000000000000000011111', & ' > 11 00000000000000000000011111111111', & ' > should be equivalent on two''s-complement processors', & ' > 1 00000000000000000000000000000001', & ' > 5 00000000000000000000000000011111', & ' > 11 00000000000000000000011111111111', & ' > elemental', & ' > (array argument accepted like called with each element)', & ' > 0 00000000000000000000000000000000', & ' > 15 00000000000000000000000000001111', & ' > 255 00000000000000000000000011111111', & ' > 4095 00000000000000000000111111111111', & ' > 65535 00000000000000001111111111111111', & ' > 1048575 00000000000011111111111111111111', & ' > 16777215 00000000111111111111111111111111', & ' > 268435455 00001111111111111111111111111111', & ' > -1 11111111111111111111111111111111', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' MASKL(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 maskr(3fortran)', & ''] shortname="maskr" call process() case('154','matmul') textblock=[character(len=256) :: & '', & 'matmul(3fortran) matmul(3fortran)', & '', & 'NAME', & ' MATMUL(3) - [ARRAY:TRANSFORMATIONAL] Numeric or logical matrix', & ' multiplication', & '', & 'SYNOPSIS', & ' result = matmul(matrix_a,matrix_b)', & '', & ' function matmul(matrix_a, matrix_b)', & '', & ' type(TYPE1(kind=**)) :: matrix_a(..)', & ' type(TYPE2(kind=**)) :: matrix_b(..)', & ' type(TYPE(kind=PROMOTED)) :: matmul(..)', & '', & 'CHARACTERISTICS', & ' o MATRIX_A is a numeric (integer, real, or complex ) or logical array of', & ' rank one two.', & '', & ' o MATRIX_B is a numeric (integer, real, or complex ) or logical array of', & ' rank one two.', & '', & ' o At least one argument must be rank two.', & '', & ' o the size of the first dimension of MATRIX_B must equal the size of the', & ' last dimension of MATRIX_A.', & '', & ' o the type of the result is the same as if an element of each argument had', & ' been multiplied as a RHS expression (that is, if the arguments are not of', & ' the same type the result follows the same rules of promotion as a simple', & ' scalar multiplication of the two types would produce)', & '', & ' o If one argument is logical, both must be logical. For logicals the', & ' resulting type is as if the .and. operator has been used on elements from', & ' the arrays.', & '', & ' o The shape of the result depends on the shapes of the arguments as', & ' described below.', & '', & 'DESCRIPTION', & ' MATMUL(3) performs a matrix multiplication on numeric or logical arguments.', & '', & 'OPTIONS', & ' o MATRIX_A : A numeric or logical array with a rank of one or two.', & '', & ' o MATRIX_B : A numeric or logical array with a rank of one or two. The last', & ' dimension of MATRIX_A and the first dimension of MATRIX_B must be equal.', & '', & ' Note that MATRIX_A and MATRIX_B may be different numeric types.', & '', & 'RESULT', & 'NUMERIC ARGUMENTS', & ' If MATRIX_A and MATRIX_B are numeric the result is an array containing the', & ' conventional matrix product of MATRIX_A and MATRIX_B.', & '', & ' First, for the numeric expression C=MATMUL(A,B)', & '', & ' o Any vector A(N) is treated as a row vector A(1,N).', & '', & ' o Any vector B(N) is treated as a column vector B(N,1).', & '', & 'SHAPE AND RANK', & ' The shape of the result can then be determined as the number of rows of the', & ' first matrix and the number of columns of the second; but if any argument is', & ' of rank one (a vector) the result is also rank one. Conversely when both', & ' arguments are of rank two, the result has a rank of two. That is ...', & '', & ' o If MATRIX_A has shape [n,m] and MATRIX_B has shape [m,k], the result has', & ' shape [n,k].', & '', & ' o If MATRIX_A has shape [m] and MATRIX_B has shape [m,k], the result has', & ' shape [k].', & '', & ' o If MATRIX_A has shape [n,m] and MATRIX_B has shape [m], the result has', & ' shape [n].', & '', & 'VALUES', & ' Then element C(I,J) of the product is obtained by multiplying term-by-term', & ' the entries of the ith row of A and the jth column of B, and summing these', & ' products. In other words, C(I,J) is the dot product of the ith row of A and', & ' the jth column of B.', & '', & 'LOGICAL ARGUMENTS', & 'VALUES', & ' If MATRIX_A and MATRIX_B are of type logical, the array elements of the', & ' result are instead:', & '', & ' Value_of_Element (i,j) = &', & ' ANY( (row_i_of_MATRIX_A) .AND. (column_j_of_MATRIX_B) )', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_matmul', & ' implicit none', & ' integer :: a(2,3), b(3,2), c(2), d(3), e(2,2), f(3), g(2), v1(4),v2(4)', & ' a = reshape([1, 2, 3, 4, 5, 6], [2, 3])', & ' b = reshape([10, 20, 30, 40, 50, 60], [3, 2])', & ' c = [1, 2]', & ' d = [1, 2, 3]', & ' e = matmul(a, b)', & ' f = matmul(c,a)', & ' g = matmul(a,d)', & '', & ' call print_matrix_int(''A is '',a)', & ' call print_matrix_int(''B is '',b)', & ' call print_vector_int(''C is '',c)', & ' call print_vector_int(''D is '',d)', & ' call print_matrix_int(''E is matmul(A,B)'',e)', & ' call print_vector_int(''F is matmul(C,A)'',f)', & ' call print_vector_int(''G is matmul(A,D)'',g)', & '', & ' ! look at argument shapes when one is a vector', & ' write(*,''(" > shape")'')', & ' ! at least one argument must be of rank two', & ' ! so for two vectors at least one must be reshaped', & ' v1=[11,22,33,44]', & ' v2=[10,20,30,40]', & '', & ' ! these return a vector C(1:1)', & ' ! treat A(1:n) as A(1:1,1:n)', & ' call print_vector_int(''Cd is a vector (not a scalar)'',&', & ' & matmul(reshape(v1,[1,size(v1)]),v2))', & ' ! or treat B(1:m) as B(1:m,1:1)', & ' call print_vector_int(''cD is a vector too'',&', & ' & matmul(v1,reshape(v2,[size(v2),1])))', & '', & ' ! or treat A(1:n) as A(1:1,1:n) and B(1:m) as B(1:m,1:1)', & ' ! but note this returns a matrix C(1:1,1:1) not a vector!', & ' call print_matrix_int(''CD is a matrix'',matmul(&', & ' & reshape(v1,[1,size(v1)]), &', & ' & reshape(v2,[size(v2),1])))', & '', & ' contains', & '', & ' ! CONVENIENCE ROUTINES TO PRINT IN ROW-COLUMN ORDER', & ' subroutine print_vector_int(title,arr)', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: arr(:)', & ' call print_matrix_int(title,reshape(arr,[1,shape(arr)]))', & ' end subroutine print_vector_int', & '', & ' subroutine print_matrix_int(title,arr)', & ' !@(#) print small 2d integer arrays in row-column format', & ' character(len=*),parameter :: all=''(" > ",*(g0,1x))'' ! a handy format', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: arr(:,:)', & ' integer :: i', & ' character(len=:),allocatable :: biggest', & '', & ' print all', & ' print all, trim(title)', & ' biggest='' '' ! make buffer to write integer into', & ' ! find how many characters to use for integers', & ' write(biggest,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(arr))))))+2', & ' ! use this format to write a row', & ' biggest=''(" > [",*(i''//trim(biggest)//'':,","))''', & ' ! print one row of array at a time', & ' do i=1,size(arr,dim=1)', & ' write(*,fmt=biggest,advance=''no'')arr(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & '', & ' end subroutine print_matrix_int', & '', & ' end program demo_matmul', & '', & ' Results:', & '', & ' >', & ' > A is', & ' > [ 1, 3, 5 ]', & ' > [ 2, 4, 6 ]', & ' >', & ' > B is', & ' > [ 10, 40 ]', & ' > [ 20, 50 ]', & ' > [ 30, 60 ]', & ' >', & ' > C is', & ' > [ 1, 2 ]', & ' >', & ' > D is', & ' > [ 1, 2, 3 ]', & ' >', & ' > E is matmul(A,B)', & ' > [ 220, 490 ]', & ' > [ 280, 640 ]', & ' >', & ' > F is matmul(C,A)', & ' > [ 5, 11, 17 ]', & ' >', & ' > G is matmul(A,D)', & ' > [ 22, 28 ]', & ' > shape', & ' >', & ' > Cd is a vector (not a scalar)', & ' > [ 3300 ]', & ' >', & ' > cD is a vector too', & ' > [ 3300 ]', & ' >', & ' > CD is a matrix', & ' > [ 3300 ]', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' PRODUCT(3), TRANSPOSE(3)', & '', & 'RESOURCES', & ' o Matrix multiplication : Wikipedia', & '', & ' o The Winograd variant of Strassen''s matrix-matrix multiply algorithm may', & ' be of interest for optimizing multiplication of very large matrices. See', & '', & ' "GEMMW: A portable level 3 BLAS Winograd variant of Strassen''s', & ' matrix-matrix multiply algorithm",', & '', & ' Douglas, C. C., Heroux, M., Slishman, G., and Smith, R. M.,', & ' Journal of Computational Physics,', & ' Vol. 110, No. 1, January 1994, pages 1-10.', & '', & ' The numerical instabilities of Strassen''s method for matrix multiplication', & ' requires special processing.', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 matmul(3fortran)', & ''] shortname="matmul" call process() case('155','max') textblock=[character(len=256) :: & '', & 'max(3fortran) max(3fortran)', & '', & 'NAME', & ' MAX(3) - [NUMERIC] Maximum value of an argument list', & '', & 'SYNOPSIS', & ' result = max(a1, a2, a3, ...)', & '', & ' elemental TYPE(kind=KIND) function max(a1, a2, a3, ... )', & '', & ' TYPE(kind=KIND,intent(in),optional :: a1', & ' TYPE(kind=KIND,intent(in),optional :: a2', & ' TYPE(kind=KIND,intent(in),optional :: a3', & ' :', & ' :', & '', & 'CHARACTERISTICS', & ' o A3, A3, A4, ... must be of the same type and kind as A1', & '', & ' o the arguments may (all) be integer, real or character', & '', & ' o there must be at least two arguments', & '', & ' o the length of a character result is the length of the longest argument', & '', & ' o the type and kind of the result is the same as those of the arguments', & '', & 'DESCRIPTION', & ' MAX(3) returns the argument with the largest (most positive) value.', & '', & ' For arguments of character type, the result is as if the arguments had been', & ' successively compared with the intrinsic operational operators, taking into', & ' account the collating sequence of the character kind.', & '', & ' The returned selected character argument is padded with blanks as needed on', & ' the right to the same length of the longest argument.', & '', & ' It is unusual for a Fortran intrinsic to take an arbitrary number of', & ' options, and in addition MAX(3) is elemental, meaning any number of', & ' arguments may be arrays as long as they are of the same shape.', & '', & ' The examples contain such cases as examples to clarify the resulting', & ' behavior for those not familiar with calling a "scalar" function elementally', & ' with arrays.', & '', & ' See maxval(3) for simply getting the max value of an array.', & '', & 'OPTIONS', & ' o A1 : The first argument determines the type and kind of the returned', & ' value, and of any remaining arguments as well.', & '', & ' o A2,A3,... : the remaining arguments of the set of values to search for a', & ' maximum in.', & '', & ' : There must be at least two arguments to MAX(3).', & '', & 'RESULT', & ' The return value corresponds to an array of the same shape of any array', & ' argument, or a scalar if all arguments are scalar.', & '', & ' The returned value when any argument is an array will be an array of the', & ' same shape where each element is the maximum value occurring at that', & ' location, treating all the scalar values as arrays of that same shape with', & ' all elements set to the scalar value.', & '', & 'EXAMPLES', & ' Sample program', & '', & ' program demo_max', & ' implicit none', & ' real :: arr1(4)= [10.0,11.0,30.0,-100.0]', & ' real :: arr2(5)= [20.0,21.0,32.0,-200.0,2200.0]', & ' integer :: box(3,4)= reshape([-6,-5,-4,-3,-2,-1,1,2,3,4,5,6],shape(box))', & '', & ' ! basic usage', & ' ! this is simple enough when all arguments are scalar', & '', & ' ! the most positive value is returned, not the one with the', & ' ! largest magnitude', & ' write(*,*)''scalars:'',max(10.0,11.0,30.0,-100.0)', & ' write(*,*)''scalars:'',max(-22222.0,-0.0001)', & '', & ' ! strings do not need to be of the same length', & ' write(*,*)''characters:'',max(''the'',''words'',''order'')', & '', & ' ! leading spaces are significant; everyone is padded on the right', & ' ! to the length of the longest argument', & ' write(*,*)''characters:'',max(''c'',''bb'',''a'')', & ' write(*,*)''characters:'',max('' c'',''b'',''a'')', & '', & ' ! elemental', & ' ! there must be at least two arguments, so even if A1 is an array', & ' ! max(A1) is not valid. See MAXVAL(3) and/or MAXLOC(3) instead.', & '', & ' ! strings in a single array do need to be of the same length', & ' ! but the different objects can still be of different lengths.', & ' write(*,"(*(''""'',a,''""'':,1x))")MAX([''A'',''Z''],[''BB'',''Y ''])', & ' ! note the result is now an array with the max of every element', & ' ! position, as can be illustrated numerically as well:', & ' write(*,''(a,*(i3,1x))'')''box= '',box', & ' write(*,''(a,*(i3,1x))'')''box**2='',sign(1,box)*box**2', & ' write(*,''(a,*(i3,1x))'')''max '',max(box,sign(1,box)*box**2)', & '', & ' ! Remember if any argument is an array by the definition of an', & ' ! elemental function all the array arguments must be the same shape.', & '', & ' ! to find the single largest value of multiple arrays you could', & ' ! use something like', & ' ! MAXVAL([arr1, arr2])', & ' ! or probably better (more likely to avoid creating a large temp array)', & ' ! max(maxval(arr1),maxval(arr2))', & ' ! instead', & '', & ' ! so this returns an array of the same shape as any input array', & ' ! where each result is the maximum that occurs at that position.', & ' write(*,*)max(arr1,arr2(1:4))', & ' ! this returns an array just like BOX except all values less than', & ' ! zero are set to zero:', & ' write(*,*)max(box,0)', & ' ! When mixing arrays and scalars you can think of the scalars', & ' ! as being a copy of one of the arrays with all values set to', & ' ! the scalar value.', & '', & ' end program demo_max', & '', & ' Results:', & '', & ' > scalars: 30.00000', & ' > scalars: -9.9999997E-05', & ' > characters:words', & ' > characters:c', & ' > characters:b', & ' > "BB" "Z "', & ' > box= -6 -5 -4 -3 -2 -1 1 2 3 4 5 6', & ' > box**2=-36 -25 -16 -9 -4 -1 1 4 9 16 25 36', & ' > max -6 -5 -4 -3 -2 -1 1 4 9 16 25 36', & ' > 20.00000 21.00000 32.00000 -100.0000', & ' > 0 0 0 0 0 0', & ' > 1 2 3 4 5 6', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' MAXLOC(3), MINLOC(3), MAXVAL(3), MINVAL(3), MIN(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 max(3fortran)', & ''] shortname="max" call process() case('156','maxexponent') textblock=[character(len=256) :: & '', & 'maxexponent(3fortran) maxexponent(3fortran)', & '', & 'NAME', & ' MAXEXPONENT(3) - [MODEL:NUMERIC] Maximum exponent of a real kind', & '', & 'SYNOPSIS', & ' result = maxexponent(x)', & '', & ' elemental integer function maxexponent(x)', & '', & ' real(kind=**),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is a real scalar or array of any real kind', & '', & ' o the result is a default integer scalar', & '', & 'DESCRIPTION', & ' MAXEXPONENT(3) returns the maximum exponent in the model of the type of X.', & '', & 'OPTIONS', & ' o X : A value used to select the kind of real to return a value for.', & '', & 'RESULT', & ' The value returned is the maximum exponent for the kind of the value queried', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_maxexponent', & ' use, intrinsic :: iso_fortran_env, only : real32,real64,real128', & ' implicit none', & ' character(len=*),parameter :: g=''(*(g0,1x))''', & ' print g, minexponent(0.0_real32), maxexponent(0.0_real32)', & ' print g, minexponent(0.0_real64), maxexponent(0.0_real64)', & ' print g, minexponent(0.0_real128), maxexponent(0.0_real128)', & ' end program demo_maxexponent', & '', & ' Results:', & '', & ' > -125 128', & ' > -1021 1024', & ' > -16381 16384', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MINEXPONENT(3),', & ' NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 maxexponent(3fortran)', & ''] shortname="maxexponent" call process() case('157','maxloc') textblock=[character(len=256) :: & '', & 'maxloc(3fortran) maxloc(3fortran)', & '', & 'NAME', & ' MAXLOC(3) - [ARRAY:LOCATION] Location of the maximum value within an array', & '', & 'SYNOPSIS', & ' result = maxloc(array [,mask]) | maxloc(array [,dim] [,mask])', & '', & ' NUMERIC function maxloc(array, dim, mask)', & '', & ' NUMERIC,intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o NUMERIC designates any intrinsic numeric type and kind.', & '', & 'DESCRIPTION', & ' MAXLOC(3) determines the location of the element in the array with the', & ' maximum value, or, if the DIM argument is supplied, determines the locations', & ' of the maximum element along each row of the array in the DIM direction.', & '', & ' If MASK is present, only the elements for which MASK is .true. are', & ' considered. If more than one element in the array has the maximum value, the', & ' location returned is that of the first such element in array element order.', & '', & ' If the array has zero size, or all of the elements of MASK are .false., then', & ' the result is an array of zeroes. Similarly, if DIM is supplied and all of', & ' the elements of MASK along a given row are zero, the result value for that', & ' row is zero.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an array of type integer, real, or character.', & '', & ' o DIM : (Optional) Shall be a scalar of type integer, with a value between', & ' one and the rank of ARRAY, inclusive. It may not be an optional dummy', & ' argument.', & '', & ' o MASK : Shall be an array of type logical, and conformable with ARRAY.', & '', & 'RESULT', & ' If DIM is absent, the result is a rank-one array with a length equal to the', & ' rank of ARRAY. If DIM is present, the result is an array with a rank one', & ' less than the rank of ARRAY, and a size corresponding to the size of ARRAY', & ' with the DIM dimension removed. If DIM is present and ARRAY has a rank of', & ' one, the result is a scalar. In all cases, the result is of default integer', & ' type.', & '', & ' The value returned is reference to the offset from the beginning of the', & ' array, not necessarily the subscript value if the array subscripts do not', & ' start with one.', & '', & 'EXAMPLES', & ' sample program', & '', & ' program demo_maxloc', & ' implicit none', & ' integer :: ii', & ' integer,save :: i(-3:3)=[(abs(abs(ii)-50),ii=-3,3)]', & ' integer,save :: ints(3,5)= reshape([&', & ' 1, 2, 3, 4, 5, &', & ' 10, 20, 30, 40, 50, &', & ' 11, 22, 33, 44, 55 &', & ' ],shape(ints),order=[2,1])', & '', & ' write(*,*) maxloc(ints)', & ' write(*,*) maxloc(ints,dim=1)', & ' write(*,*) maxloc(ints,dim=2)', & ' ! when array bounds do not start with one remember MAXLOC(3) returns', & ' ! the offset relative to the lower bound-1 of the location of the', & ' ! maximum value, not the subscript of the maximum value. When the', & ' ! lower bound of the array is one, these values are the same. In', & ' ! other words, MAXLOC(3) returns the subscript of the value assuming', & ' ! the first subscript of the array is one no matter what the lower', & ' ! bound of the subscript actually is.', & ' write(*,''(g0,1x,g0)'') (ii,i(ii),ii=lbound(i,dim=1),ubound(i,dim=1))', & ' write(*,*)maxloc(i)', & '', & ' end program demo_maxloc', & '', & ' Results:', & '', & ' > 3 5', & ' > 3 3 3 3 3', & ' > 5 5 5', & ' > -3 47', & ' > -2 48', & ' > -1 49', & ' > 0 50', & ' > 1 49', & ' > 2 48', & ' > 3 47', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o FINDLOC(3) - Location of first element of ARRAY identified by MASK along', & ' dimension DIM matching a target', & '', & ' o MINLOC(3) - Location of the minimum value within an array', & '', & ' o MAXVAL(3)', & '', & ' o MINVAL(3)', & '', & ' o MAX(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 maxloc(3fortran)', & ''] shortname="maxloc" call process() case('158','maxval') textblock=[character(len=256) :: & '', & 'maxval(3fortran) maxval(3fortran)', & '', & 'NAME', & ' MAXVAL(3) - [ARRAY:REDUCTION] Determines the maximum value in an array or', & ' row', & '', & 'SYNOPSIS', & ' result = maxval(array [,mask]) | maxval(array [,dim] [,mask])', & '', & ' NUMERIC function maxval(array ,dim, mask)', & '', & ' NUMERIC,intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o NUMERIC designates any numeric type and kind.', & '', & 'DESCRIPTION', & ' MAXVAL(3) determines the maximum value of the elements in an array value,', & ' or, if the DIM argument is supplied, determines the maximum value along each', & ' row of the array in the DIM direction. If MASK is present, only the elements', & ' for which MASK is .true. are considered.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an array of type integer, real, or character.', & '', & ' o DIM : (Optional) Shall be a scalar of type integer, with a value between', & ' one and the rank of ARRAY, inclusive. It may not be an optional dummy', & ' argument.', & '', & ' o MASK : (Optional) Shall be an array of type logical, and conformable with', & ' ARRAY.', & '', & 'RESULT', & ' If DIM is absent, or if ARRAY has a rank of one, the result is a scalar. If', & ' DIM is present, the result is an array with a rank one less than the rank of', & ' ARRAY, and a size corresponding to the size of ARRAY with the DIM dimension', & ' removed. In all cases, the result is of the same type and kind as ARRAY.', & '', & ' If the considered array has zero size then the result is the most negative', & ' number of the type and kind of ARRAY if ARRAY is numeric, or a string of', & ' nulls if ARRAY is of ASCII character type. or equal to CHAR(0, KIND(ARRAY))', & ' otherwise.', & '', & 'EXAMPLES', & ' sample program:', & '', & ' program demo_maxval', & ' implicit none', & ' integer,save :: ints(3,5)= reshape([&', & ' 1, 2, 3, 4, 5, &', & ' 10, 20, 30, 40, 50, &', & ' 11, 22, 33, 44, 55 &', & ' ],shape(ints),order=[2,1])', & ' character(len=:),allocatable :: strs(:)', & ' integer :: i', & ' character(len=*),parameter :: gen=''(*(g0,1x))''', & ' character(len=*),parameter :: ind=''(3x,*(g0,1x))''', & '', & ' print gen,''Given the array''', & ' write(*,''(1x,*(g4.4,1x))'') &', & ' & (ints(i,:),new_line(''a''),i=1,size(ints,dim=1))', & ' print gen,''Basics:''', & ' print ind, ''biggest value in array''', & ' print ind, maxval(ints)', & ' print ind, ''biggest value in each column''', & ' print ind, maxval(ints,dim=1)', & ' print ind, ''biggest value in each row''', & ' print ind, maxval(ints,dim=2)', & '', & ' print gen,''With a mask:''', & ' print ind, '' find biggest number less than 30 with mask''', & ' print ind, maxval(ints,mask=ints.lt.30)', & '', & ' print gen,''If zero size considered:''', & ' print ind, ''if zero size numeric array''', & ' print ind, maxval([integer :: ]),''and -huge(0) is'',-huge(0),&', & ' & ''(often not the same!)''', & ' print ind, ''if zero-size character array all nulls''', & ' strs=[character(len=5)::]', & ' strs=maxval(strs)', & ' print ind, ichar([(strs(i),i=1,len(strs))])', & ' print ind, ''if everything is false,''', & ' print ind, ''same as zero-size array for each subarray''', & ' print ind, maxval(ints,mask=.false.)', & ' print ind, maxval(ints,mask=.false.,dim=1)', & ' end program demo_maxval', & '', & ' Results:', & '', & ' > Given the array:', & ' > 1, 2, 3, 4, 5, &', & ' > 10, 20, 30, 40, 50, &', & ' > 11, 22, 33, 44, 55 &', & ' > biggest value in array', & ' > 55', & ' > biggest value in each column', & ' > 11 22 33 44 55', & ' > biggest value in each row', & ' > 5 50 55', & ' > find biggest number less than 30 with mask', & ' > 22', & ' > if zero size numeric array', & ' > -2147483648 and -huge(0) is -2147483647 (often not the same!)', & ' > if zero-size character array all nulls', & ' > 0 0 0 0 0', & ' > if everything is false, same as zero-size array', & ' > -2147483648', & ' > -2147483648 -2147483648 -2147483648 -2147483648 -2147483648', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' MINVAL(3), MINLOC(3), MAXLOC(3), MIN(3) MAX(3),', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 maxval(3fortran)', & ''] shortname="maxval" call process() case('159','merge') textblock=[character(len=256) :: & '', & 'merge(3fortran) merge(3fortran)', & '', & 'NAME', & ' MERGE(3) - [ARRAY:CONSTRUCTION] Merge variables', & '', & 'SYNOPSIS', & ' result = merge(tsource, fsource, mask)', & '', & ' elemental type(TYPE(kind=KIND)) function merge(tsource,fsource,mask)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: tsource', & ' type(TYPE(kind=KIND)),intent(in) :: fsource', & ' logical(kind=**),intent(in) :: mask', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o TSOURCE May be of any type, including user-defined.', & '', & ' o FSOURCE Shall be of the same type and type parameters as TSOURCE.', & '', & ' o MASK shall be of type logical.', & '', & ' o The result will by of the same type and type parameters as TSOURCE.', & '', & 'DESCRIPTION', & ' The elemental function MERGE(3) selects values from two arrays or scalars', & ' according to a logical mask. The result is equal to an element of TSOURCE', & ' where the corresponding element of MASK is .true., or an element of FSOURCE', & ' when it is .false. .', & '', & ' Multi-dimensional arrays are supported.', & '', & ' Note that argument expressions to MERGE(3) are not required to be short-', & ' circuited so (as an example) if the array X contains zero values in the', & ' statement below the standard does not prevent floating point divide by zero', & ' being generated; as 1.0/X may be evaluated for all values of X before the', & ' mask is used to select which value to retain:', & '', & ' y = merge( 1.0/x, 0.0, x /= 0.0 )', & '', & ' Note the compiler is also free to short-circuit or to generate an infinity', & ' so this may work in many programming environments but is not recommended.', & '', & ' For cases like this one may instead use masked assignment via the WHERE', & ' construct:', & '', & ' where(x .ne. 0.0)', & ' y = 1.0/x', & ' elsewhere', & ' y = 0.0', & ' endwhere', & '', & ' instead of the more obscure', & '', & ' merge(1.0/merge(x,1.0,x /= 0.0), 0.0, x /= 0.0)', & '', & 'OPTIONS', & ' o TSOURCE : May be of any type, including user-defined.', & '', & ' o FSOURCE : Shall be of the same type and type parameters as TSOURCE.', & '', & ' o MASK : Shall be of type logical.', & '', & ' Note that (currently) character values must be of the same length.', & '', & 'RESULT', & ' The result is built from an element of TSOURCE if MASK is .true. and from', & ' FSOURCE otherwise.', & '', & ' Because TSOURCE and FSOURCE are required to have the same type and type', & ' parameters (for both the declared and dynamic types), the result is', & ' polymorphic if and only if both TSOURCE and FSOURCE are polymorphic.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_merge', & ' implicit none', & ' integer :: tvals(2,3), fvals(2,3), answer(2,3)', & ' logical :: mask(2,3)', & ' integer :: i', & ' integer :: k', & ' logical :: chooseleft', & '', & ' ! Works with scalars', & ' k=5', & ' write(*,*)merge (1.0, 0.0, k > 0)', & ' k=-2', & ' write(*,*)merge (1.0, 0.0, k > 0)', & '', & ' ! set up some simple arrays that all conform to the', & ' ! same shape', & ' tvals(1,:)=[ 10, -60, 50 ]', & ' tvals(2,:)=[ -20, 40, -60 ]', & '', & ' fvals(1,:)=[ 0, 3, 2 ]', & ' fvals(2,:)=[ 7, 4, 8 ]', & '', & ' mask(1,:)=[ .true., .false., .true. ]', & ' mask(2,:)=[ .false., .false., .true. ]', & '', & ' ! lets use the mask of specific values', & ' write(*,*)''mask of logicals''', & ' answer=merge( tvals, fvals, mask )', & ' call printme()', & '', & ' ! more typically the mask is an expression', & ' write(*, *)''highest values''', & ' answer=merge( tvals, fvals, tvals > fvals )', & ' call printme()', & '', & ' write(*, *)''lowest values''', & ' answer=merge( tvals, fvals, tvals < fvals )', & ' call printme()', & '', & ' write(*, *)''zero out negative values''', & ' answer=merge( 0, tvals, tvals < 0)', & ' call printme()', & '', & ' write(*, *)''binary choice''', & ' chooseleft=.false.', & ' write(*, ''(3i4)'')merge([1,2,3],[10,20,30],chooseleft)', & ' chooseleft=.true.', & ' write(*, ''(3i4)'')merge([1,2,3],[10,20,30],chooseleft)', & '', & ' contains', & '', & ' subroutine printme()', & ' write(*, ''(3i4)'')(answer(i, :), i=1, size(answer, dim=1))', & ' end subroutine printme', & '', & ' end program demo_merge', & '', & ' Results:', & '', & ' > 1.00000000', & ' > 0.00000000', & ' > mask of logicals', & ' > 10 3 50', & ' > 7 4 -60', & ' > highest values', & ' > 10 3 50', & ' > 7 40 8', & ' > lowest values', & ' > 0 -60 2', & ' > -20 4 -60', & ' > zero out negative values', & ' > 10 0 50', & ' > 0 40 0', & ' > binary choice', & ' > 10 20 30', & ' > 1 2 3', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o PACK(3) packs an array into an array of rank one', & '', & ' o SPREAD(3) is used to add a dimension and replicate data', & '', & ' o UNPACK(3) scatters the elements of a vector', & '', & ' o TRANSPOSE(3) - Transpose an array of rank two', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 merge(3fortran)', & ''] shortname="merge" call process() case('160','merge_bits') textblock=[character(len=256) :: & '', & 'merge_bits(3fortran) merge_bits(3fortran)', & '', & 'NAME', & ' MERGE_BITS(3) - [BIT:COPY] Merge bits using a mask', & '', & 'SYNOPSIS', & ' result = merge_bits(i, j, mask)', & '', & ' elemental integer(kind=KIND) function merge_bits(i,j,mask)', & '', & ' integer(kind=KIND), intent(in) :: i, j, mask', & '', & 'CHARACTERISTICS', & ' o the result and all input values have the same integer type and KIND with', & ' the exception that the mask and either I or J may be a BOZ constant.', & '', & 'DESCRIPTION', & ' A common graphics operation in Ternary Raster Operations is to combine bits', & ' from two different sources, generally referred to as bit-blending.', & ' MERGE_BITS(3) performs a masked bit-blend of I and J using the bits of the', & ' MASK value to determine which of the input values to copy bits from.', & '', & ' Specifically, The k-th bit of the result is equal to the k-th bit of I if', & ' the k-th bit of MASK is 1; it is equal to the k-th bit of J otherwise (so', & ' all three input values must have the same number of bits).', & '', & ' The resulting value is the same as would result from', & '', & ' ior (iand (i, mask),iand (j, not (mask)))', & '', & ' An exception to all values being of the same integer type is that I or J', & ' and/or the mask may be a BOZ constant (A BOZ constant means it is either a', & ' Binary, Octal, or Hexadecimal literal constant). The BOZ values are', & ' converted to the integer type of the non-BOZ value(s) as if called by the', & ' intrinsic function INT() with the kind of the non-BOZ value(s), so the BOZ', & ' values must be in the range of the type of the result.', & '', & 'OPTIONS', & ' o I : value to select bits from when the associated bit in the mask is', & '', & ' 1.', & '', & ' o J : value to select bits from when the associated bit in the mask is', & '', & ' 0.', & '', & ' o MASK : a value whose bits are used as a mask to select bits from I and J', & '', & 'RESULT', & ' The bits blended from I and J using the mask MASK.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_merge_bits', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int16) :: if_one,if_zero,msk', & ' character(len=*),parameter :: fmt=''(*(g0, 1X))''', & '', & ' ! basic usage', & ' print *,''MERGE_BITS( 5,10,41) should be 3.=>'',merge_bits(5,10,41)', & ' print *,''MERGE_BITS(13,18,22) should be 4.=>'',merge_bits(13,18,22)', & '', & ' ! use some values in base2 illustratively:', & ' if_one =int(b''1010101010101010'',kind=int16)', & ' if_zero=int(b''0101010101010101'',kind=int16)', & '', & ' msk=int(b''0101010101010101'',kind=int16)', & ' print ''("should get all zero bits =>",b16.16)'', &', & ' & merge_bits(if_one,if_zero,msk)', & '', & ' msk=int(b''1010101010101010'',kind=int16)', & ' print ''("should get all ones bits =>",b16.16)'', &', & ' & merge_bits(if_one,if_zero,msk)', & '', & ' ! using BOZ values', & ' print fmt, &', & ' & merge_bits(32767_int16, o''12345'', 32767_int16), &', & ' & merge_bits(o''12345'', 32767_int16, b''0000000000010101''), &', & ' & merge_bits(32767_int16, o''12345'', z''1234'')', & '', & ' ! a do-it-yourself equivalent for comparison and validation', & ' print fmt, &', & ' & ior(iand(32767_int16, 32767_int16), &', & ' & iand(o''12345'', not(32767_int16))), &', & '', & ' & ior(iand(o''12345'', int(o''12345'', kind=int16)), &', & ' & iand(32767_int16, not(int(o''12345'', kind=int16)))), &', & '', & ' & ior(iand(32767_int16, z''1234''), &', & ' & iand(o''12345'', not(int( z''1234'', kind=int16))))', & '', & ' end program demo_merge_bits', & '', & ' Results:', & '', & ' > MERGE_BITS( 5,10,41) should be 3.=> 3', & ' > MERGE_BITS(13,18,22) should be 4.=> 4', & ' > should get all zero bits =>0000000000000000', & ' > should get all ones bits =>1111111111111111', & ' > 32767 32751 5877', & ' > 32767 32767 5877', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' o dshiftl(3) - Combined left shift of the bits of two integers', & '', & ' o dshiftr(3) - Combined right shift of the bits of two integers', & '', & ' o ibits(3) - Extraction of a subset of bits', & '', & ' o merge_bits(3) - Merge bits using a mask', & '', & ' o mvbits(3) - Reproduce bit patterns found in one integer in another', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 merge_bits(3fortran)', & ''] shortname="merge_bits" call process() case('161','min') textblock=[character(len=256) :: & '', & 'min(3fortran) min(3fortran)', & '', & 'NAME', & ' MIN(3) - [NUMERIC] Minimum value of an argument list', & '', & 'SYNOPSIS', & ' result = min(a1, a2, a3, ... )', & '', & ' elemental TYPE(kind=KIND) function min(a1, a2, a3, ... )', & '', & ' TYPE(kind=KIND,intent(in) :: a1', & ' TYPE(kind=KIND,intent(in) :: a2', & ' TYPE(kind=KIND,intent(in) :: a3', & ' :', & ' :', & ' :', & '', & 'CHARACTERISTICS', & ' o TYPE may be integer, real or character.', & '', & 'DESCRIPTION', & ' MIN(3) returns the argument with the smallest (most negative) value.', & '', & ' The arguments must the same type which shall be integer, real, or character', & ' and they also all have the same kind type parameter.', & '', & ' The type and kind type parameter of the result are the same as those of the', & ' arguments.', & '', & ' NOTE:', & '', & ' A common extension is that the argument kinds can vary. In that case the', & ' returned value may be the kind of the first argument, or might be the kind', & ' of the expression a1+a2+a3+a4... per the rules of promotion.', & '', & 'OPTIONS', & ' o A1 : the first element of the set of values to examine.', & '', & ' o A2, A3, ... : An expression of the same type and kind as A1 completing', & ' the set of values to evaluate.', & '', & 'RESULT', & ' The return value corresponds to the minimum value among the arguments, and', & ' has the same type and kind as the first argument.', & '', & 'EXAMPLES', & ' Sample program', & '', & ' program demo_min', & ' implicit none', & ' integer :: i', & ' integer :: rectangle(3,4)=reshape([(-6+i,i=0,11)],[3,4])', & ' print *, ''basics''', & ' print *, min(10.0,11.0,30.0,-100.0)', & ' print *, min(-200.0,-1.0)', & ' print *, ''elemental''', & ' print *, min(1,[2,3,4])', & ' print *, min(5,[2,3,4])', & '', & ' print *, ''box:''', & ' do i=1,size(rectangle,dim=1)', & ' write(*,''(*(i3,1x))'')rectangle(i,:)', & ' enddo', & ' print *, ''make all values 0 or less:''', & ' do i=1,size(rectangle,dim=1)', & ' write(*,''(*(i3,1x))'')min(rectangle(i,:),0)', & ' enddo', & ' end program demo_min', & '', & ' Results:', & '', & ' > basics', & ' > -100.000000', & ' > -200.000000', & ' > elemental', & ' > 1 1 1', & ' > 2 3 4', & ' > box:', & ' > -6 -3 0 3', & ' > -5 -2 1 4', & ' > -4 -1 2 5', & ' > make all values 0 or less:', & ' > -6 -3 0 0', & ' > -5 -2 0 0', & ' > -4 -1 0 0', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' MAX(3), MAXLOC(3), MINLOC(3), MINVAL(3), MAXVAL(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost ''', & '', & ' March 16, 2025 min(3fortran)', & ''] shortname="min" call process() case('162','minexponent') textblock=[character(len=256) :: & '', & 'minexponent(3fortran) minexponent(3fortran)', & '', & 'NAME', & ' MINEXPONENT(3) - [MODEL:NUMERIC] Minimum exponent of a real kind', & '', & 'SYNOPSIS', & ' result = minexponent(x)', & '', & ' elemental integer function minexponent(x)', & '', & ' real(kind=**),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is a real scalar or array of any real kind', & '', & ' o the result is a default integer scalar', & '', & 'DESCRIPTION', & ' MINEXPONENT(3) returns the minimum exponent in the model of the type of X.', & '', & 'OPTIONS', & ' o X : A value used to select the kind of real to return a value for.', & '', & 'RESULT', & ' The value returned is the maximum exponent for the kind of the value queried', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_minexponent', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real32) :: x', & ' real(kind=real64) :: y', & ' print *, minexponent(x), maxexponent(x)', & ' print *, minexponent(y), maxexponent(y)', & ' end program demo_minexponent', & '', & ' Expected Results:', & '', & ' > -125 128', & ' > -1021 1024', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 minexponent(3fortran)', & ''] shortname="minexponent" call process() case('163','minloc') textblock=[character(len=256) :: & '', & 'minloc(3fortran) minloc(3fortran)', & '', & 'NAME', & ' MINLOC(3) - [ARRAY:LOCATION] Location of the minimum value within an array', & '', & 'SYNOPSIS', & ' result = minloc(array [,mask]) | minloc(array [,dim] [,mask])', & '', & ' NUMERIC function minloc(array, dim, mask)', & '', & ' NUMERIC,intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o NUMERIC is any numeric type and kind.', & '', & 'DESCRIPTION', & ' MINLOC(3) determines the location of the element in the array with the', & ' minimum value, or, if the DIM argument is supplied, determines the locations', & ' of the minimum element along each row of the array in the DIM direction.', & '', & ' If MASK is present, only the elements for which MASK is true. are', & ' considered.', & '', & ' If more than one element in the array has the minimum value, the location', & ' returned is that of the first such element in array element order.', & '', & ' If the array has zero size, or all of the elements of MASK are .false., then', & ' the result is an array of zeroes. Similarly, if DIM is supplied and all of', & ' the elements of MASK along a given row are zero, the result value for that', & ' row is zero.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an array of type integer, real, or character.', & '', & ' o DIM : (Optional) Shall be a scalar of type integer, with a value between', & ' one and the rank of ARRAY, inclusive. It may not be an optional dummy', & ' argument.', & '', & ' o MASK : Shall be an array of type logical, and conformable with ARRAY.', & '', & 'RESULT', & ' If DIM is absent, the result is a rank-one array with a length equal to the', & ' rank of ARRAY. If DIM is present, the result is an array with a rank one', & ' less than the rank of ARRAY, and a size corresponding to the size of ARRAY', & ' with the DIM dimension removed. If DIM is present and ARRAY has a rank of', & ' one, the result is a scalar. In all cases, the result is of default integer', & ' type.', & '', & 'EXAMPLES', & ' sample program:', & '', & ' program demo_minloc', & ' implicit none', & ' integer,save :: ints(3,5)= reshape([&', & ' 4, 10, 1, 7, 13, &', & ' 9, 15, 6, 12, 3, &', & ' 14, 5, 11, 2, 8 &', & ' ],shape(ints),order=[2,1])', & ' write(*,*) minloc(ints)', & ' write(*,*) minloc(ints,dim=1)', & ' write(*,*) minloc(ints,dim=2)', & ' ! where in each column is the smallest number .gt. 10 ?', & ' write(*,*) minloc(ints,dim=2,mask=ints.gt.10)', & ' ! a one-dimensional array with dim=1 explicitly listed returns a scalar', & ' write(*,*) minloc(pack(ints,.true.),dim=1) ! scalar', & ' end program demo_minloc', & '', & ' Results:', & '', & ' > 1 3', & ' > 1 3 1 3 2', & ' > 3 5 4', & ' > 5 4 3', & ' > 7', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o FINDLOC(3) - Location of first element of ARRAY identified by MASK along', & ' dimension DIM matching a target', & '', & ' o MAXLOC(3) - Location of the maximum value within an array', & '', & ' o MINLOC(3) - Location of the minimum value within an array', & '', & ' o MIN(3)', & '', & ' o MINVAL(3)', & '', & ' o MAXVAL(3)', & '', & ' o MAX(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 minloc(3fortran)', & ''] shortname="minloc" call process() case('164','minval') textblock=[character(len=256) :: & '', & 'minval(3fortran) minval(3fortran)', & '', & 'NAME', & ' MINVAL(3) - [ARRAY:REDUCTION] Minimum value of all the elements of ARRAY', & ' along dimension DIM corresponding to true elements of MASK.', & '', & 'SYNOPSIS', & ' forms:', & '', & ' result = minval(array [,mask])', & '', & ' or', & '', & ' result = minval(array ,dim [,mask])', & '', & ' type(TYPE(kind=**)) function minval(array, dim, mask)', & '', & ' type(TYPE(kind=**)),intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & '', & 'CHARACTERISTICS', & ' o TYPE may be real, integer, or character.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o DIM is an integer scalar indicating a dimension of the array. It may not', & ' be an optional dummy argument.', & '', & ' o MASK is an array of type logical, and conformable with ARRAY.', & '', & ' o the result is of the same type and kind as ARRAY.', & '', & 'DESCRIPTION', & ' MINVAL(3) determines the minimum value of the elements in an array or, if', & ' the DIM argument is supplied, determines the minimum value in the subarrays', & ' indicated by stepping along the DIMth dimension.', & '', & ' Note that the result of', & '', & ' MINVAL(ARRAY, MASK = MASK)', & '', & ' has a value equal to that of', & '', & ' MINVAL (PACK (ARRAY, MASK)).', & '', & ' and The result of', & '', & ' MINVAL (ARRAY, DIM = DIM [, MASK = MASK])', & '', & ' has a value equal to that of', & '', & ' MINVAL (ARRAY [, MASK = MASK])', & '', & ' if ARRAY has rank one. Otherwise, the value of element (s1 , s2 , . . . ,', & ' sDIM-1 , sDIM+1 , . . . , sn ) of the result is equal to', & '', & ' MINVAL (ARRAY (s1 , s2 , . . . , sDIM-1 , :, sDIM+1 , . . . , sn )', & ' [, MASK= MASK (s1 , s2 , . . . , sDIM-1 , :, sDIM+1 , . . . , sn ) ] ).', & '', & 'OPTIONS', & ' o ARRAY : array to search for minimum values. If the array has zero size,', & ' or all of the elements of MASK are .false., then the result is', & ' HUGE(ARRAY) if ARRAY is numeric, or an array of strings of', & ' CHAR(LEN=LEN(ARRAY)) characters, with each character equal to CHAR (n -', & ' 1, KIND (ARRAY)), where n is the number of characters in the collating', & ' sequence for characters with the kind type parameter of ARRAY.', & '', & ' If ARRAY is of type character, the result is the value that would be', & ' selected by application of intrinsic relational operators; that is, the', & ' collating sequence for characters with the kind type parameter of the', & ' arguments is applied.', & '', & ' o DIM : Indicates which dimension to split the array into subarrays along.', & ' It has a value between one and the rank of ARRAY, inclusive.', & '', & ' o MASK ; If MASK is present, only the elements for which MASK is .true. are', & ' considered when searching for the minimal value.', & '', & 'RESULT', & ' If DIM is absent, or if ARRAY has a rank of one, the result is a scalar.', & '', & ' If DIM is present, the result is an array with a rank one less than the rank', & ' of ARRAY, and a size corresponding to the size of ARRAY with the DIM', & ' dimension removed. In all cases, the result is of the same type and kind as', & ' ARRAY.', & '', & 'EXAMPLES', & ' sample program:', & '', & ' program demo_minval', & ' implicit none', & ' integer :: i', & ' character(len=:),allocatable :: strs(:)', & ' character(len=*),parameter :: g=''(3x,*(g0,1x))''', & '', & ' integer,save :: ints(3,5)= reshape([&', & ' 1, -2, 3, 4, 5, &', & ' 10, 20, -30, 40, 50, &', & ' 11, 22, 33, -44, 55 &', & ' ],shape(ints),order=[2,1])', & '', & ' integer,save :: box(3,5,2)', & '', & ' box(:,:,1)=ints', & ' box(:,:,2)=-ints', & '', & ' write(*,*)''Given the array''', & ' write(*,''(1x,*(g4.4,1x))'') &', & ' & (ints(i,:),new_line(''a''),i=1,size(ints,dim=1))', & '', & ' write(*,*)''What is the smallest element in the array?''', & ' write(*,g) minval(ints),''at <'',minloc(ints),''>''', & '', & ' write(*,*)''What is the smallest element in each column?''', & ' write(*,g) minval(ints,dim=1)', & '', & ' write(*,*)''What is the smallest element in each row?''', & ' write(*,g) minval(ints,dim=2)', & '', & ' ! notice the shape of the output has less columns', & ' ! than the input in this case', & ' write(*,*)''What is the smallest element in each column,''', & ' write(*,*)''considering only those elements that are''', & ' write(*,*)''greater than zero?''', & ' write(*,g) minval(ints, dim=1, mask = ints > 0)', & '', & ' write(*,*)&', & ' & ''if everything is false a zero-sized array is NOT returned''', & ' write(*,*) minval(ints, dim=1, mask = .false.)', & ' write(*,*)''even for a zero-sized input''', & ' write(*,g) minval([integer ::], dim=1, mask = .false.)', & '', & ' write(*,*)''a scalar answer for everything false is huge()''', & ' write(*,g) minval(ints, mask = .false.)', & ' write(*,g) minval([integer ::], mask = .false.)', & '', & ' print *, ''if zero-size character array all dels if ASCII''', & ' strs=[character(len=5)::]', & ' strs=minval(strs)', & ' print g, ichar([(strs(i),i=1,len(strs))])', & '', & ' write(*,*)''some calls with three dimensions''', & ' write(*,g) minval(box, mask = .true. )', & ' write(*,g) minval(box, dim=1, mask = .true. )', & '', & ' write(*,g) minval(box, dim=2, mask = .true. )', & ' write(*,g) ''shape of answer is '', &', & ' & shape(minval(box, dim=2, mask = .true. ))', & '', & ' end program demo_minval', & '', & ' Result:', & '', & ' > Given the array', & ' > 1 -2 3 4 5', & ' > 10 20 -30 40 50', & ' > 11 22 33 -44 55', & ' >', & ' > What is the smallest element in the array?', & ' > -44 at < 3 4 >', & ' > What is the smallest element in each column?', & ' > 1 -2 -30 -44 5', & ' > What is the smallest element in each row?', & ' > -2 -30 -44', & ' > What is the smallest element in each column,', & ' > considering only those elements that are', & ' > greater than zero?', & ' > 1 20 3 4 5', & ' > if everything is false a zero-sized array is NOT returned', & ' > 2147483647 2147483647 2147483647 2147483647 2147483647', & ' > even for a zero-sized input', & ' > 2147483647', & ' > a scalar answer for everything false is huge()', & ' > 2147483647', & ' > 2147483647', & ' > if zero-size character array all dels if ASCII', & ' >', & ' > some calls with three dimensions', & ' > -55', & ' > 1 -2 -30 -44 5 -11 -22 -33 -40 -55', & ' > -2 -30 -44 -5 -50 -55', & ' > shape of answer is 3 2', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' MAXVAL(3), MIN(3), MAX(3) MINLOC(3) MAXLOC(3),', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 minval(3fortran)', & ''] shortname="minval" call process() case('165','mod') textblock=[character(len=256) :: & '', & 'mod(3fortran) mod(3fortran)', & '', & 'NAME', & ' MOD(3) - [NUMERIC] Remainder function', & '', & 'SYNOPSIS', & ' result = mod(a, p)', & '', & ' elemental type(TYPE(kind=KIND)) function mod(a,p)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: a', & ' type(TYPE(kind=KIND)),intent(in) :: p', & '', & 'CHARACTERISTICS', & ' o The result and arguments are all of the same type and kind.', & '', & ' o The type may be any kind of real or integer.', & '', & 'DESCRIPTION', & ' MOD(3) computes the remainder of the division of A by P.', & '', & ' In mathematics, the remainder is the amount "left over" after performing', & ' some computation. In arithmetic, the remainder is the integer "left over"', & ' after dividing one integer by another to produce an integer quotient', & ' (integer division). In algebra of polynomials, the remainder is the', & ' polynomial "left over" after dividing one polynomial by another. The modulo', & ' operation is the operation that produces such a remainder when given a', & ' dividend and divisor.', & '', & ' o (remainder). (2022, October 10). In Wikipedia.', & ' https://en.wikipedia.org/wiki/Remainder', & '', & 'OPTIONS', & ' o A : The dividend', & '', & ' o P : the divisor (not equal to zero).', & '', & 'RESULT', & ' The return value is the result of A - (INT(A/P) * P).', & '', & ' As can be seen by the formula the sign of P is canceled out. Therefore the', & ' returned value always has the sign of A.', & '', & ' Of course, the magnitude of the result will be less than the magnitude of P,', & ' as the result has been reduced by all multiples of P.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_mod', & ' implicit none', & '', & ' ! basics', & ' print *, mod( -17, 3 ), modulo( -17, 3 )', & ' print *, mod( 17, -3 ), modulo( 17, -3 )', & ' print *, mod( 17, 3 ), modulo( 17, 3 )', & ' print *, mod( -17, -3 ), modulo( -17, -3 )', & '', & ' print *, mod(-17.5, 5.2), modulo(-17.5, 5.2)', & ' print *, mod( 17.5,-5.2), modulo( 17.5,-5.2)', & ' print *, mod( 17.5, 5.2), modulo( 17.5, 5.2)', & ' print *, mod(-17.5,-5.2), modulo(-17.5,-5.2)', & '', & ' ! with a divisor of 1 the fractional part is returned', & ' print *, mod(-17.5, 1.0), modulo(-17.5, 1.0)', & ' print *, mod( 17.5,-1.0), modulo( 17.5,-1.0)', & ' print *, mod( 17.5, 1.0), modulo( 17.5, 1.0)', & ' print *, mod(-17.5,-1.0), modulo(-17.5,-1.0)', & '', & ' end program demo_mod', & '', & ' Results:', & '', & ' > -2 1', & ' > 2 -1', & ' > 2 2', & ' > -2 -2', & ' > -1.900001 3.299999', & ' > 1.900001 -3.299999', & ' > 1.900001 1.900001', & ' > -1.900001 -1.900001', & ' > -0.5000000 0.5000000', & ' > 0.5000000 -0.5000000', & ' > 0.5000000 0.5000000', & ' > -0.5000000 -0.5000000', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o MODULO(3) - Modulo function', & '', & ' o AINT(3) - truncate toward zero to a whole real number', & '', & ' o INT(3) - truncate toward zero to a whole integer number', & '', & ' o ANINT(3) - real nearest whole number', & '', & ' o NINT(3) - integer nearest whole number', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 mod(3fortran)', & ''] shortname="mod" call process() case('166','modulo') textblock=[character(len=256) :: & '', & 'modulo(3fortran) modulo(3fortran)', & '', & 'NAME', & ' MODULO(3) - [NUMERIC] Modulo function', & '', & 'SYNOPSIS', & ' result = modulo(a, p)', & '', & ' elemental TYPE(kind=KIND) function modulo(a,p)', & '', & ' TYPE(kind=KIND),intent(in) :: a', & ' TYPE(kind=KIND),intent(in) :: p', & '', & 'CHARACTERISTICS', & ' o A may be any kind of real or integer.', & '', & ' o P is the same type and kind as A', & '', & ' o The result and arguments are all of the same type and kind.', & '', & 'DESCRIPTION', & ' MODULO(3) computes the A modulo P.', & '', & 'OPTIONS', & ' o A : the value to take the MODULO of', & '', & ' o P : The value to reduce A by till the remainder is <= P. It shall not be', & ' zero.', & '', & 'RESULT', & ' The type and kind of the result are those of the arguments.', & '', & ' o If A and P are of type integer: MODULO(A,P) has the value of A - FLOOR', & ' (REAL(A) / REAL(P)) * P.', & '', & ' o If A and P are of type real: MODULO(A,P) has the value of A - FLOOR (A /', & ' P) * P.', & '', & ' The returned value has the same sign as P and a magnitude less than the', & ' magnitude of P.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_modulo', & ' implicit none', & ' print *, modulo(17,3) ! yields 2', & ' print *, modulo(17.5,5.5) ! yields 1.0', & '', & ' print *, modulo(-17,3) ! yields 1', & ' print *, modulo(-17.5,5.5) ! yields 4.5', & '', & ' print *, modulo(17,-3) ! yields -1', & ' print *, modulo(17.5,-5.5) ! yields -4.5', & ' end program demo_modulo', & '', & ' Results:', & '', & ' > 2', & ' > 1.000000', & ' > 1', & ' > 4.500000', & ' > -1', & ' > -4.500000', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' MOD(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 modulo(3fortran)', & ''] shortname="modulo" call process() case('167','move_alloc') textblock=[character(len=256) :: & '', & 'move_alloc(3fortran) move_alloc(3fortran)', & '', & 'NAME', & ' MOVE_ALLOC(3) - [MEMORY] Move allocation from one object to another', & '', & 'SYNOPSIS', & ' call move_alloc(from, to [,stat] [,errmsg] )', & '', & ' subroutine move_alloc(from, to)', & '', & ' type(TYPE(kind=**)),intent(inout),allocatable :: from(..)', & ' type(TYPE(kind=**)),intent(out),allocatable :: to(..)', & ' integer(kind=**),intent(out) :: stat', & ' character(len=*),intent(inout) :: errmsg', & '', & 'CHARACTERISTICS', & ' o FROM may be of any type and kind.', & '', & ' o TO shall be of the same type, kind and rank as FROM.', & '', & 'DESCRIPTION', & ' MOVE_ALLOC(3) moves the allocation from FROM to TO. FROM will become', & ' deallocated in the process.', & '', & ' This is potentially more efficient than other methods of assigning the', & ' values in FROM to TO and explicitly deallocating FROM, which are far more', & ' likely to require a temporary object or a copy of the elements of the array.', & '', & 'OPTIONS', & ' o FROM : The data object to be moved to TO and deallocated.', & '', & ' o TO : The destination data object to move the allocated data object FROM', & ' to. Typically, it is a different shape than FROM.', & '', & ' o STAT : If STAT is present and execution is successful, it is assigned the', & ' value zero.', & '', & ' Otherwise, if an error condition occurs:', & '', & ' o if STAT is absent, error termination is initiated; o otherwise, if', & ' FROM is a coarray and the current team contains a stopped image, STAT', & ' is assigned the value STAT_STOPPED_IMAGE from the intrinsic module', & ' ISO_FORTRAN_ENV; o otherwise, if FROM is a coarray and the current', & ' team contains a failed image, and no other error condition occurs,', & ' STAT is assigned the value STAT_FAILED_IMAGE from the intrinsic module', & ' ISO_FORTRAN_ENV; o otherwise, STAT is assigned a processor-dependent', & ' positive value that differs from that of STAT_STOPPED_IMAGE or', & ' STAT_FAILED_IMAGE.', & '', & ' o ERRMSG : If the ERRMSG argument is present and an error condition occurs,', & ' it is assigned an explanatory message. If no error condition occurs, the', & ' definition status and value of ERRMSG are unchanged.', & '', & 'EXAMPLES', & ' Basic sample program to allocate a bigger grid', & '', & ' program demo_move_alloc', & ' implicit none', & ' ! Example to allocate a bigger GRID', & ' real, allocatable :: grid(:), tempgrid(:)', & ' integer :: n, i', & '', & ' ! initialize small GRID', & ' n = 3', & ' allocate (grid(1:n))', & ' grid = [ (real (i), i=1,n) ]', & '', & ' ! initialize TEMPGRID which will be used to replace GRID', & ' allocate (tempgrid(1:2*n)) ! Allocate bigger grid', & ' tempgrid(::2) = grid ! Distribute values to new locations', & ' tempgrid(2::2) = grid + 0.5 ! initialize other values', & '', & ' ! move TEMPGRID to GRID', & ' call MOVE_ALLOC (from=tempgrid, to=grid)', & '', & ' ! TEMPGRID should no longer be allocated', & ' ! and GRID should be the size TEMPGRID was', & ' if (size (grid) /= 2*n .or. allocated (tempgrid)) then', & ' print *, "Failure in move_alloc!"', & ' endif', & ' print *, allocated(grid), allocated(tempgrid)', & ' print ''(99f8.3)'', grid', & ' end program demo_move_alloc', & '', & ' Results:', & '', & ' > T F', & ' > 1.000 1.500 2.000 2.500 3.000 3.500', & '', & 'STANDARD', & ' Fortran 2003, STAT and ERRMSG options added 2018', & '', & 'SEE ALSO', & ' ALLOCATED(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 move_alloc(3fortran)', & ''] shortname="move_alloc" call process() case('168','mvbits') textblock=[character(len=256) :: & '', & 'mvbits(3fortran) mvbits(3fortran)', & '', & 'NAME', & ' MVBITS(3) - [BIT:COPY] Reproduce bit patterns found in one integer in', & ' another', & '', & 'SYNOPSIS', & ' call mvbits(from, frompos, len, to, topos)', & '', & ' elemental subroutine mvbits( from, frompos, len, to, topos )', & '', & ' integer(kind=KIND),intent(in) :: from', & ' integer(kind=**),intent(in) :: frompos', & ' integer(kind=**),intent(in) :: len', & ' integer(kind=KIND),intent(inout) :: to', & ' integer(kind=**),intent(in) :: topos', & '', & 'CHARACTERISTICS', & ' o FROM is an integer', & '', & ' o FROMPOS is an integer', & '', & ' o LEN is an integer', & '', & ' o TO is an integer of the same kind as FROM.', & '', & ' o TOPOS is an integer', & '', & 'DESCRIPTION', & ' MVBITS(3) copies a bit pattern found in a range of adjacent bits in the', & ' integer FROM to a specified position in another integer TO (which is of the', & ' same kind as FROM). It otherwise leaves the bits in TO as-is.', & '', & ' The bit positions copied must exist within the value of FROM. That is, the', & ' values of FROMPOS+LEN-1 and TOPOS+LEN-1 must be nonnegative and less than', & ' BIT_SIZE(from).', & '', & ' The bits are numbered 0 to BIT_SIZE(I)-1, from right to left.', & '', & 'OPTIONS', & ' o FROM : An integer to read bits from.', & '', & ' o FROMPOS : FROMPOS is the position of the first bit to copy. It is a', & ' nonnegative integer value < BIT_SIZE(FROM).', & '', & ' o LEN : A nonnegative integer value that indicates how many bits to copy', & ' from FROM. It must not specify copying bits past the end of FROM. That', & ' is, FROMPOS + LEN must be less than or equal to BIT_SIZE(FROM).', & '', & ' o TO : The integer variable to place the copied bits into. It must be of', & ' the same kind as FROM and may even be the same variable as FROM, or', & ' associated to it.', & '', & ' TO is set by copying the sequence of bits of length LEN, starting at', & ' position FROMPOS of FROM to position TOPOS of TO. No other bits of TO are', & ' altered. On return, the LEN bits of TO starting at TOPOS are equal to the', & ' value that the LEN bits of FROM starting at FROMPOS had on entry.', & '', & ' o TOPOS : A nonnegative integer value indicating the starting location in', & ' TO to place the specified copy of bits from FROM. TOPOS + LEN must be', & ' less than or equal to BIT_SIZE(TO).', & '', & 'EXAMPLES', & ' Sample program that populates a new 32-bit integer with its bytes in reverse', & ' order from the input value (ie. changes the Endian of the integer).', & '', & ' program demo_mvbits', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int32) :: intfrom, intto, abcd_int', & ' character(len=*),parameter :: bits= ''(g0,t30,b32.32)''', & ' character(len=*),parameter :: fmt= ''(g0,t30,a,t40,b32.32)''', & '', & ' intfrom=huge(0) ! all bits are 1 accept the sign bit', & ' intto=0 ! all bits are 0', & '', & ' !! CHANGE BIT 0', & ' ! show the value and bit pattern', & ' write(*,bits)intfrom,intfrom', & ' write(*,bits)intto,intto', & '', & ' ! copy bit 0 from intfrom to intto to show the rightmost bit changes', & ' ! (from, frompos, len, to, topos)', & ' call mvbits(intfrom, 0, 1, intto, 0) ! change bit 0', & ' write(*,bits)intto,intto', & '', & ' !! COPY PART OF A VALUE TO ITSELF', & ' ! can copy bit from a value to itself', & ' call mvbits(intfrom,0,1,intfrom,31)', & ' write(*,bits)intfrom,intfrom', & '', & ' !! MOVING BYTES AT A TIME', & ' ! make native integer value with bit patterns', & ' ! that happen to be the same as the beginning of the alphabet', & ' ! to make it easy to see the bytes are reversed', & ' abcd_int=transfer(''abcd'',0)', & ' ! show the value and bit pattern', & ' write(*,*)''native''', & ' write(*,fmt)abcd_int,abcd_int,abcd_int', & '', & ' ! change endian of the value', & ' abcd_int=int_swap32(abcd_int)', & ' ! show the values and their bit pattern', & ' write(*,*)''non-native''', & ' write(*,fmt)abcd_int,abcd_int,abcd_int', & '', & ' contains', & '', & ' pure elemental function int_swap32(intin) result(intout)', & ' ! Convert a 32 bit integer from big Endian to little Endian,', & ' ! or conversely from little Endian to big Endian.', & ' !', & ' integer(kind=int32), intent(in) :: intin', & ' integer(kind=int32) :: intout', & ' ! copy bytes from input value to new position in output value', & ' ! (from, frompos, len, to, topos)', & ' call mvbits(intin, 0, 8, intout, 24) ! byte1 to byte4', & ' call mvbits(intin, 8, 8, intout, 16) ! byte2 to byte3', & ' call mvbits(intin, 16, 8, intout, 8) ! byte3 to byte2', & ' call mvbits(intin, 24, 8, intout, 0) ! byte4 to byte1', & ' end function int_swap32', & '', & ' end program demo_mvbits', & '', & ' Results:', & '', & ' > 2147483647 01111111111111111111111111111111', & ' > 0 00000000000000000000000000000000', & ' > 1 00000000000000000000000000000001', & ' > -1 11111111111111111111111111111111', & ' > native', & ' > 1684234849 abcd 01100100011000110110001001100001', & ' > non-native', & ' > 1633837924 dcba 01100001011000100110001101100100', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' BTEST(3), IAND(3), IBCLR(3), IBITS(3), IBSET(3), IEOR(3), IOR(3), NOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 mvbits(3fortran)', & ''] shortname="mvbits" call process() case('169','namelist') textblock=[character(len=256) :: & '', & 'namelist(7fortran) namelist(7fortran)', & '', & 'NAME', & ' namelist(7f) - [STATEMENT] specify a group of data to be referred to by a', & ' single name in data input/output', & '', & 'SYNOPSIS', & ' NAMELIST /namelist-group-name/ namelist-group-object-list [[,] /namelist-', & ' group-name/ namelist-group-object-list ] ...', & '', & ' namelist-group-object is variable-name', & '', & 'DESCRIPTION', & ' A NAMELIST statement specifies a group of named data objects, which may be', & ' referred to by a single name for the purpose of data transfer.', & '', & ' The order in which the variables are specified in the NAMELIST statement', & ' determines the order in which the values appear on output.', & '', & ' o The namelist-group-name shall not be a name accessed by use', & ' association.', & '', & ' o A namelist-group-object shall not be an assumed-size array.', & '', & ' o A namelist-group-object shall not have the PRIVATE attribute if the', & ' namelist-group-name has the PUBLIC attribute.', & '', & ' Any namelist-group-name may occur more than once in the NAMELIST statements', & ' in a scoping unit. The namelist-group-object-list following each successive', & ' appearance of the same namelist-group-name in a scoping unit is treated as a', & ' continuation of the list for that namelist-group-name.', & '', & ' A namelist group object may be a member of more than one namelist group.', & '', & ' A namelist group object shall either be accessed by use or host association', & ' or shall have its type, type parameters, and shape specified by previous', & ' specification statements or the procedure heading in the same scoping unit', & ' or by the implicit typing rules in effect for the scoping unit. If a', & ' namelist group object is typed by the implicit typing rules, its appearance', & ' in any subsequent type declaration statement shall confirm the implied type', & ' and type parameters.', & '', & ' The specification-part of a BLOCK construct shall not contain a NAMELIST', & ' statement.', & '', & ' Why is NAMELIST not allowed in a BLOCK unit? Would be handy for quick', & ' writes, like list-directed output', & '', & ' block', & ' namelist /nlist/ a,b,c,d', & ' write(*,nlist)', & ' endblock', & '', & ' Input for a namelist input statement consists of', & '', & ' 1. optional blanks and namelist comments,', & '', & ' 2. the character & followed immediately by the namelist-group-name as', & ' specified in the NAMELIST statement,', & '', & ' 3. one or more blanks,', & '', & ' 4. a sequence of zero or more name-value subsequences separated by value', & ' separators, and', & '', & ' 5. a slash to terminate the namelist input.', & '', & ' A slash encountered in a namelist input record causes the input', & ' statement to terminate. A slash cannot be used to separate two', & ' values in a namelist input statement.', & '', & ' A group name or object name is without regard to case.', & '', & 'EXAMPLE', & ' An example of a NAMELIST statement is:', & '', & ' NAMELIST /NLIST/ A, B, C', & '', & ' or a group may be defined by multiple statements using the same group name', & ' in a scoping unit:', & '', & ' NAMELIST /NLIST/ A, B', & ' NAMELIST /NLIST/ C', & '', & ' ! READ/WRITE EXAMPLES: [ NML = ] namelist-group-name', & ' READ(*,NML=NLIST)', & ' WRITE(*,NLIST)', & ' WRITE(*,NML=NLIST)', & '', & ' program sample_namelist', & ' implicit none', & ' logical :: l=.true.', & ' character(len=10) :: c=''XXXXXXXXXX''', & ' real :: r=12.3456', & ' integer :: i=789', & ' complex :: x=(12345.6789,9876.54321)', & ' doubleprecision :: d= 123456789.123456789d0', & ' namelist /nlist/ l,c,r,i,x,d', & ' write(*,nlist)', & ' end program sample_namelist', & '', & ' Results:', & '', & ' > &NLIST', & ' > L=T,', & ' > C="XXXXXXXXXX",', & ' > R= 12.3456001 ,', & ' > I= 789,', & ' > X=( 12345.6787 , 9876.54297 ),', & ' > D= 123456789.12345679 ,', & ' > /', & '', & ' Longer example:', & '', & ' program demo_namelist', & ' implicit none', & ' integer :: lun', & '', & ' ! create a namelist and initialize the values', & ' logical :: l=.true.', & ' character(len=10) :: c=''XXXXXXXXXX''', & ' real :: r=12.3456', & ' integer :: i=789', & ' complex :: x=(12345.6789,9876.54321)', & ' doubleprecision :: d= 123456789.123456789d0', & ' integer :: a(5)=[1,2,3,4,5]', & ' type point', & ' integer :: x=0', & ' integer :: y=0', & ' character(len=10) :: color=''red''', & ' endtype point', & ' type(point) :: dot', & ' namelist /nlist/ l,c,r,i,x,d,a,dot', & '', & ' open(file=''_tmp_'',newunit=lun,action=''readwrite'')', & '', & ' write(*,*)''initial nlist''', & ' write(*,nlist)', & ' write(lun,nlist)', & '', & ' write(*,*)''change values and print nlist again''', & ' a=[10,20,30,40,50]', & ' dot%color=''orange''', & ' write(lun,nlist)', & '', & ' write(*,*)''read back values. Can have multiple sets in a file''', & ' rewind(lun)', & ' read(lun,nlist)', & ' read(lun,nlist)', & ' write(*,nlist)', & '', & ' end program demo_namelist', & '', & ' Results:', & '', & ' > initial nlist', & ' > &NLIST', & ' > L=T,', & ' > C="XXXXXXXXXX",', & ' > R= 12.3456001 ,', & ' > I= 789,', & ' > X=(12345.6787,9876.54297),', & ' > D= 123456789.12345679 ,', & ' > A= 1, 2, 3, 4, 5,', & ' >', & ' > DOT%X= 0,', & ' > DOT%Y= 0,', & ' > DOT%COLOR="red ",', & ' > /', & ' > change values and print nlist again', & ' > read back values. Can have multiple sets in a file', & ' > &NLIST', & ' > L=T,', & ' > C="XXXXXXXXXX",', & ' > R= 12.3456001 ,', & ' > I= 789,', & ' > X=(12345.6787,9876.54297),', & ' > D= 123456789.12345679 ,', & ' > A= 10, 20, 30, 40, 50,', & ' >', & ' > DOT%X= 0,', & ' > DOT%Y= 0,', & ' > DOT%COLOR="orange ",', & ' > /', & '', & ' o Scanning on input till group name is found', & ' o reading partial lists', & ' o string quoting', & ' o NAMELIST in internal read and write. See', & '', & ' ./arguments/namelist', & '', & 'OTHER', & ' C915 (R913) A namelist-group-name shall be the name of a namelist group.', & '', & ' C916 (R913) A namelist-group-name shall not appear if a REC= specifier,', & ' format, input-item-list, or an output-item-list appears in the data transfer', & ' statement. C917 (R913) An io-control-spec-list shall not contain both a', & ' format and a namelist-group-name. C919 (R913) If namelist-group-name appears', & ' without a preceding NML=, it shall be the second item in the io-control-', & ' spec-list and the first item shall be io-unit. C928 (R913) If a DECIMAL=,', & ' BLANK=, PAD=, SIGN=, or ROUND= specifier appears, a format or namelist-', & ' group-name shall also appear. C929 (R913) If a DELIM= specifier appears,', & ' either format shall be an asterisk or namelist-group-name shall appear. 3.', & ' If the data transfer statement contains a format or namelist-group-name, the', & ' statement is a formatted input/output statement; otherwise, it is an', & ' unformatted input/output statement.', & '', & ' 1. The NML= specifier supplies the namelist-group-name (5.6). This name', & ' identifies a particular collection of data objects on which transfer is', & ' to be performed.', & '', & ' 2. If a namelist-group-name appears, the statement is a namelist', & ' input/output statement.', & '', & ' 3. All values following the name= part of the namelist entity (10.11)', & ' within the input records are transmitted to the matching entity', & ' specified in the namelist-group-object-list prior to processing any', & ' succeeding entity within the input record for namelist input statements.', & ' If an entity is specified more than once within the input record during', & ' a namelist formatted data transfer input statement, the last occurrence', & ' of the entity specifies the value or values to be used for that entity.', & '', & ' 9.6.4.6 Namelist formatting', & '', & ' 1. If namelist formatting has been established, editing is performed as', & ' described in 10.11.', & '', & ' 2. Every allocatable namelist-group-object in the namelist group shall be', & ' allocated and every namelist-group-object that is a pointer shall be', & ' associated with a target. If a namelist-group-object is polymorphic or', & ' has an ultimate component that is allocatable or a pointer, that object', & ' shall be processed by a defined input/output procedure (9.6.4.7).', & '', & ' 9.6.5 Termination of data transfer statements', & '', & ' 1. Termination of an input/output data transfer statement occurs when', & '', & ' format processing encounters a colon or data edit descriptor and', & ' there are no remaining elements in the input-item-list or', & ' output-item-list,', & '', & ' unformatted or list-directed data transfer exhausts the', & ' input-item-list or output-item-list, namelist output exhausts the', & ' namelist-group-object-list,', & '', & ' an error condition occurs,', & '', & ' an end-of-file condition occurs,', & '', & ' a slash (/) is encountered as a value separator (10.10, 10.11) in', & ' the record being read during list-directed or namelist input, or an', & ' end-of-record condition occurs during execution of a nonadvancing', & ' input statement (9.11).', & '', & ' 2. If an error condition occurs during execution of an input/output', & ' statement that contains neither an ERR= nor IOSTAT= specifier, error', & ' termination of the program is initiated. If an error condition occurs', & ' during execution of an input/output statement that contains either an', & ' ERR= specifier or an IOSTAT= specifier then: 1. processing of the', & ' input/output list, if any, terminates;', & '', & ' 2. if the statement is a data transfer statement or the error occurs', & ' during a wait operation, all do-variables in the statement that', & ' initiated the transfer become undefined;', & '', & ' 3. if an IOSTAT= specifier appears, the scalar-int-variable in the', & ' IOSTAT= specifier becomes defined as specified in 9.11.5;', & '', & ' 4. if an IOMSG= specifier appears, the iomsg-variable becomes defined', & ' as specified in 9.11.6;', & '', & ' 5. if the statement is a READ statement and it contains a SIZE=', & ' specifier, the scalar-int-variable in the SIZE= specifier becomes', & ' defined as specified in 9.6.2.15;', & '', & ' 6. if the statement is a READ statement or the error condition occurs', & ' in a wait operation for a transfer initiated by a READ statement,', & ' all input items or namelist group objects in the statement that', & ' initiated the transfer become undefined;', & '', & ' 7. if an ERR= specifier appears, a branch to the statement labeled by', & ' the label in the ERR= specifier occurs.', & '', & ' 3. In a data transfer statement, the variable specified in an IOSTAT=,', & ' IOMSG=, or SIZE= specifier, if any, shall not be associated with any', & ' entity in the data transfer input/output list (9.6.3) or namelist-group-', & ' object-list, nor with a do-variable of an io-implied-do in the data', & ' transfer input/output list. 10.11 Namelist formatting 10.11.1 General', & '', & ' 4. Namelist input/output allows data editing with NAME=value subsequences.', & ' This facilitates documentation of input and output files and more', & ' flexibility on input.', & '', & ' 10.11.2 Name-value subsequences', & '', & ' 1. The characters in one or more namelist records constitute a sequence of', & ' name-value subsequences, each of which consists of an object designator', & ' followed by an equals and followed by one or more values and value', & ' separators. The equals may optionally be preceded or followed by one or', & ' more contiguous blanks. The end of a record has the same effect as a', & ' blank character, unless it is within a character constant. Any sequence', & ' of two or more consecutive blanks is treated as a single blank, unless', & ' it is within a character constant.', & '', & ' 2. The name may be any name in the namelist-group-object-list (5.6).', & '', & ' 3. A value separator for namelist formatting is the same as for list-', & ' directed formatting (10.10).', & '', & ' 10.11.3 Namelist input 10.11.3.1 Overall syntax', & '', & ' 2. In each name-value subsequence, the name shall be the name of a namelist', & ' group object list item with an optional qualification and the name with', & ' the optional qualification shall not be a zero-sized array, a zero-sized', & ' array section, or a zero-length character string. The optional', & ' qualification, if any, shall not contain a vector subscript.', & '', & ' 10.11.3.2 Namelist group object names', & '', & ' 1. Within the input data, each name shall correspond to a particular', & ' namelist group object name. Subscripts, strides, and substring range', & ' expressions used to qualify group object names shall be optionally', & ' signed integer literal constants with no kind type parameters specified.', & ' If a namelist group object is an array, the input record corresponding', & ' to it may contain either the array name or the designator of a subobject', & ' of that array, using the syntax of object designators (R601). If the', & ' namelist group object name is the name of a variable of derived type,', & ' the name in the input record may be either the name of the variable or', & ' the designator of one of its components, indicated by qualifying the', & ' variable name with the appropriate component name. Successive', & ' qualifications may be applied as appropriate to the shape and type of', & ' the variable represented.', & '', & ' 2. The order of names in the input records need not match the order of the', & ' namelist group object items. The input records need not contain all the', & ' names of the namelist group object items. The definition status of any', & ' names from the namelist-group-object-list that do not occur in the input', & ' record remains unchanged. In the input record, each object name or', & ' subobject designator may be preceded and followed by one or more', & ' optional blanks but shall not contain embedded blanks.', & '', & ' 10.11.3.3 Namelist group object list items', & '', & ' 1. The name-value subsequences are evaluated serially, in left-to-right', & ' order. A namelist group object designator may appear in more than one', & ' name-value sequence.', & '', & ' 2. When the name in the input record represents an array variable or a', & ' variable of derived type, the effect is as if the variable represented', & ' were expanded into a sequence of scalar list items, in the same way that', & ' formatted input/output list items are expanded (9.6.3). Each input value', & ' following the equals shall then be acceptable to format specifications', & ' for the type of the list item in the corresponding position in the', & ' expanded sequence, except as noted in this subclause. The number of', & ' values following the equals shall not exceed the number of list items in', & ' the expanded sequence, but may be less; in the latter case, the effect', & ' is as if sufficient null values had been appended to match any remaining', & ' list items in the expanded sequence.', & '', & ' NOTE 10.35 For example, if the name in the input record is the name of', & ' an integer array of size 100, at most 100 values, each of which is', & ' either a digit string or a null value, may follow the equals; these', & ' values would then be assigned to the elements of the array in array', & ' element order.', & '', & ' 3. A slash encountered as a value separator during the execution of a', & ' namelist input statement causes termination of execution of that input', & ' statement after transference of the previous value. If there are', & ' additional items in the namelist group object being transferred, the', & ' effect is as if null values had been supplied for them.', & '', & ' 4. A namelist comment may appear after any value separator except a slash.', & ' A namelist comment is also permitted to start in the first nonblank', & ' position of an input record except within a character literal constant.', & '', & ' 5. Successive namelist records are read by namelist input until a slash is', & ' encountered; the remainder of the record is ignored and need not follow', & ' the rules for namelist input values.', & '', & ' 10.11.3.4 Namelist input values', & '', & ' 6. Each value is either a null value (10.11.3.5), c, r*c, or r*, where c is', & ' a literal constant, optionally signed if integer or real, and r is an', & ' unsigned, nonzero, integer literal constant. A kind type parameter shall', & ' not be specified for c or r. The constant c is interpreted as though it', & ' had the same kind type parameter as the corresponding effective item.', & ' The r*c form is equivalent to r successive appearances of the constant', & ' c, and the r * form is equivalent to r successive null values. Neither', & ' of these forms may contain embedded blanks, except where permitted', & ' within the constant c.', & '', & ' 7. The datum c (10.11) is any input value acceptable to format', & ' specifications for a given type, except for a restriction on the form of', & ' input values corresponding to list items of types logical, integer, and', & ' character as specified in this subclause. The form of a real or complex', & ' value is dependent on the decimal edit mode in effect (10.6). The form', & '', & ' of an input value shall be acceptable for the type of the namelist group', & ' object list item. The number and forms of the input values that may', & ' follow the equals in a name-value subsequence depend on the shape and', & ' type of the object represented by the name in the input record. When the', & ' name in the input record is that of a scalar variable of an intrinsic', & ' type, the equals shall not be followed by more than one value. Blanks', & ' are never used as zeros, and embedded blanks are not permitted in', & ' constants except within character constants and complex constants as', & ' specified in this subclause.', & '', & ' 8. When the next effective item is of type real, the input form of the', & ' input value is that of a numeric input field. A numeric input field is a', & ' field suitable for F editing (10.7.2.3.2) that is assumed to have no', & ' fractional digits unless a decimal symbol appears within the field.', & '', & ' 9. When the next effective item is of type complex, the input form of the', & ' input value consists of a left parenthesis followed by an ordered pair', & ' of numeric input fields separated by a comma (if the decimal edit mode', & ' is POINT) or a semicolon (if the decimal edit mode is COMMA), and', & ' followed by a right parenthesis. The first numeric input field is the', & ' real part of the complex constant and the second part is the imaginary', & ' part. Each of the numeric input fields may be preceded or followed by', & ' any number of blanks and ends of records. The end of a record may occur', & ' between the real part and the comma or semicolon, or between the comma', & ' or semicolon and the imaginary part.', & '', & ' 10. When the next effective item is of type logical, the input form of the', & ' input value shall not include equals or value separators among the', & ' optional characters permitted for L editing (10.7.3).', & '', & ' 11. When the next effective item is of type integer, the value in the input', & ' record is interpreted as if an Iw edit descriptor with a suitable value', & ' of w were used.', & '', & ' 12. When the next effective item is of type character, the input form', & ' consists of a delimited sequence of zero or more rep-char s whose kind', & ' type parameter is implied by the kind of the corresponding list item.', & ' Such a sequence may be continued from the end of one record to the', & ' beginning of the next record, but the end of record shall not occur', & ' between a doubled apostrophe in an apostrophe-delimited sequence, nor', & ' between a doubled quote in a quote-delimited sequence. The end of the', & ' record does not cause a blank or any other character to become part of', & ' the sequence. The sequence may be continued on as many records as', & ' needed. The characters blank, comma, semicolon, and slash may appear in', & ' such character sequences.', & '', & ' NOTE 10.36 A character sequence corresponding to a namelist input item', & ' of character type shall be delimited either with apostrophes or with', & ' quotes. The delimiter is required to avoid ambiguity between undelimited', & ' character sequences and object names. The value of the DELIM= specifier,', & ' if any, in the OPEN statement for an external file is ignored during', & ' namelist input (9.5.6.8).', & '', & ' 13. Let len be the length of the next effective item, and let w be the', & ' length of the character sequence. If len is less than or equal to w, the', & ' leftmost len characters of the sequence are transmitted to the next', & ' effective item. If len is greater than w, the constant is transmitted to', & ' the leftmost w characters of the next effective item and the remaining', & ' len-w characters of the next effective item are filled with blanks. The', & ' effect is as though the sequence were assigned to the next effective', & ' item in an intrinsic assignment statement (7.2.1.3).', & '', & ' 10.11.3.5 Null values', & '', & ' 1. A null value is specified by', & '', & ' the r * form,', & '', & ' blanks between two consecutive nonblank value separators following', & ' an equals,', & '', & ' zero or more blanks preceding the first value separator and', & ' following an equals, or two consecutive nonblank value separators.', & '', & ' 2. A null value has no effect on the definition status of the corresponding', & ' input list item. If the namelist group object list item is defined, it', & ' retains its previous value; if it is undefined, it remains undefined. A', & ' null value shall', & '', & ' not be used as either the real or imaginary part of a complex constant,', & ' but a single null value may represent an entire complex constant.', & '', & ' NOTE 10.37 The end of a record following a value separator, with or', & ' without intervening blanks, does not specify a null value in namelist', & ' input.', & '', & ' 10.11.3.6 Blanks', & '', & ' 1. All blanks in a namelist input record are considered to be part of some', & ' value separator except for', & '', & ' o blanks embedded in a character constant, o embedded blanks', & ' surrounding the real or imaginary part of a complex constant, o', & ' leading blanks following the equals unless followed immediately by a', & ' slash or comma, or a semicolon if the o decimal edit mode is comma,', & ' and o blanks between a name and the following equals.', & '', & ' 10.11.3.7 Namelist Comments', & '', & ' 1. Except within a character literal constant, a "!" character after a', & ' value separator or in the first nonblank position of a namelist input', & ' record initiates a comment. The comment extends to the end of the', & ' current input record and may contain any graphic character in the', & ' processor-dependent character set. The comment is ignored. A slash', & ' within the namelist comment does not terminate execution of the namelist', & ' input statement. Namelist comments are not allowed in stream input', & ' because comments depend on record structure.', & '', & ' NOTE 10.38 Namelist input example:', & '', & ' INTEGER I; REAL X (8); CHARACTER (11) P; COMPLEX Z;', & ' LOGICAL :: G', & ' NAMELIST / TODAY / G, I, P, Z, X', & ' READ (*, NML = TODAY)', & '', & ' The input data records are:', & '', & ' &TODAY I = 12345, X(1) = 12345, X(3:4) = 2*1.5,', & ' I=6, ! This is a comment.', & ' P = ''''ISN''T_BOB''S'''', Z = (123,0)/', & '', & ' The results stored are:', & '', & ' Variable Value', & ' I 6', & ' X (1) 12345.0', & ' X (2) unchanged', & ' X (3) 1.5', & ' X (4) 1.5', & ' X (5) X (8) unchanged', & ' P ISN''T BOB''S', & ' Z (123.0,0.0)', & ' G unchanged', & '', & ' 10.11.4 Namelist output 10.11.4.1 Form of namelist output', & '', & ' 1. The form of the output produced is the same as that required for input,', & ' except for the forms of real, character, and logical values. The name', & ' in the output is in upper case. With the exception of adjacent', & ' undelimited character values, the values are separated by one or more', & ' blanks or by a comma, or a semicolon if the decimal edit mode is COMMA,', & ' optionally preceded by one or more blanks and optionally followed by one', & ' or more blanks.', & '', & ' 2. Namelist output shall not include namelist comments.', & '', & ' 3. The processor may begin new records as necessary. However, except for', & ' complex constants and character values, the end of a record shall not', & ' occur within a constant, character value, or name, and blanks shall not', & ' appear within a constant, character value, or name.', & '', & ' NOTE 10.39 The length of the output records is not specified exactly and', & ' may be processor dependent.', & '', & ' 10.11.4.2 Namelist output editing', & '', & ' 1. Values in namelist output records are edited as for list-directed output', & ' (10.10.4).', & '', & ' NOTE 10.40 Namelist output records produced with a DELIM= specifier with', & ' a value of NONE and which contain a character sequence might not be', & ' acceptable as namelist input records.', & '', & ' 10.11.4.3 Namelist output records', & '', & ' 1. If two or more successive values for the same namelist group item in an', & ' output record produced have identical values, the processor has the', & ' option of producing a repeated constant of the form r *c instead of the', & ' sequence of identical values.', & '', & ' 2. The name of each namelist group object list item is placed in the output', & ' record followed by an equals and a list of values of the namelist group', & ' object list item.', & '', & ' 3. An ampersand character followed immediately by a namelist-group-name', & ' will be produced by namelist formatting at the start of the first output', & ' record to indicate which particular group of data objects is being', & ' output. A slash is produced by namelist formatting to indicate the end', & ' of the namelist formatting.', & '', & ' 4. A null value is not produced by namelist formatting.', & '', & ' 5. Except for new records created by explicit formatting within a defined', & ' output procedure or by continuation of delimited character sequences,', & ' each output record begins with a blank character.', & '', & ' March 16, 2025 namelist(7fortran)', & ''] shortname="namelist" call process() case('170','nearest') textblock=[character(len=256) :: & '', & 'nearest(3fortran) nearest(3fortran)', & '', & 'NAME', & ' NEAREST(3) - [MODEL:COMPONENTS] Nearest representable number', & '', & 'SYNOPSIS', & ' result = nearest(x, s)', & '', & ' elemental real(kind=KIND) function nearest(x,s)', & '', & ' real(kind=KIND),intent(in) :: x', & ' real(kind=**),intent(in) :: s', & '', & 'CHARACTERISTICS', & ' o X may be a real value of any kind.', & '', & ' o S may be a real value of any kind.', & '', & ' o The return value is of the same type and kind as X.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' NEAREST(3) returns the processor-representable number nearest to X in the', & ' direction indicated by the sign of S.', & '', & 'OPTIONS', & ' o X : the value to find the nearest representable value of', & '', & ' o S : a non-zero value whose sign is used to determine the direction in', & ' which to search from X to the representable value.', & '', & ' If S is positive, NEAREST returns the processor-representable number', & ' greater than X and nearest to it.', & '', & ' If S is negative, NEAREST returns the processor-representable number', & ' smaller than X and nearest to it.', & '', & 'RESULT', & ' The return value is of the same type as X. If S is positive, NEAREST returns', & ' the processor-representable number greater than X and nearest to it. If S is', & ' negative, NEAREST returns the processor-representable number smaller than X', & ' and nearest to it.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_nearest', & ' implicit none', & '', & ' real :: x, y', & ' x = nearest(42.0, 1.0)', & ' y = nearest(42.0, -1.0)', & ' write (*,"(3(g20.15))") x, y, x - y', & '', & ' ! write (*,"(3(g20.15))") &', & ' ! nearest(tiny(0.0),1.0), &', & ' ! nearest(tiny(0.0),-1.0), &', & ' ! nearest(tiny(0.0),1.0) -nearest(tiny(0.0),-1.0)', & '', & ' ! write (*,"(3(g20.15))") &', & ' ! nearest(huge(0.0),1.0), &', & ' ! nearest(huge(0.0),-1.0), &', & ' ! nearest(huge(0.0),1.0)- nearest(huge(0.0),-1.0)', & '', & ' end program demo_nearest', & '', & ' Results:', & '', & ' > 42.0000038146973 41.9999961853027 .762939453125000E-05', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 nearest(3fortran)', & ''] shortname="nearest" call process() case('171','new_line') textblock=[character(len=256) :: & '', & 'new_line(3fortran) new_line(3fortran)', & '', & 'NAME', & ' NEW_LINE(3) - [CHARACTER:INQUIRY] Newline character', & '', & 'SYNOPSIS', & ' result = new_line(c)', & '', & ' character(len=1,kind=KIND) function new_line(c)', & '', & ' character(len=1,kind=KIND),intent(in) :: c(..)', & '', & 'CHARACTERISTICS', & ' o C shall be of type character. It may be a scalar or an array.', & '', & ' o the result is a character scalar of length one with the same kind type', & ' parameter as C.', & '', & 'DESCRIPTION', & ' NEW_LINE(3) returns the newline character.', & '', & ' Normally, newlines are generated with regular formatted I/O statements like', & ' WRITE() and PRINT() when each statement completes:', & '', & ' print *, ''x=11''', & ' print *', & ' print *, ''y=22''', & ' end', & '', & ' produces:', & '', & ' x=11', & '', & ' y=22', & '', & ' Alternatively, a "/" descriptor in a format is used to generate a newline on', & ' the output. For example:', & '', & ' write(*,''(a,1x,i0,/,a)'') ''x ='',11,''is the answer''', & ' end', & '', & ' produces:', & '', & ' x = 11', & ' is the answer', & '', & ' Also, for formatted sequential output if more data is listed on the output', & ' statement than can be represented by the format statement a newline is', & ' generated and then the format is reused until the output list is exhausted.', & '', & ' write(*,''(a,"=",i0)'') ''x'', 10, ''y'', 20', & ' end', & '', & ' produces', & '', & ' x=10', & ' y=20', & '', & ' But there are occasions, particularly when non-advancing I/O or stream I/O', & ' is being generated (which does not generate a newline at the end of each', & ' WRITE statement, as normally occurs) where it is preferable to place a', & ' newline explicitly in the output at specified points.', & '', & ' To do so you must make sure you are generating the correct newline', & ' character, which the techniques above do automatically.', & '', & ' The newline character varies between some platforms, and can even depend on', & ' the encoding (ie. which character set is being used) of the output file. In', & ' these cases selecting the correct character to output can be determined by', & ' the NEW_LINE(3) procedure.', & '', & 'OPTIONS', & ' o C : an arbitrary character whose kind is used to decide on the output', & ' character that represents a newline.', & '', & 'RESULT', & ' Case (i) : If A is default character and the character in position 10 of the', & ' ASCII collating sequence is representable in the default character set, then', & ' the result is ACHAR(10).', & '', & ' This is the typical case, and just requires using "new_line(''a'')".', & '', & ' Case (ii) : If A is an ASCII character or an ISO 10646 character, then the', & ' result is CHAR(10, KIND (A)).', & '', & ' Case (iii) : Otherwise, the result is a processor-dependent character that', & ' represents a newline in output to files connected for formatted stream', & ' output if there is such a character.', & '', & ' Case (iv) : If not of the previous cases apply, the result is the blank', & ' character.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_new_line', & ' implicit none', & ' character,parameter :: nl=new_line(''a'')', & ' character(len=:),allocatable :: string', & ' real :: r', & ' integer :: i, count', & '', & ' ! basics', & ' ! print a string with a newline embedded in it', & ' string=''This is record 1.''//nl//''This is record 2.''', & ' write(*,''(a)'') string', & '', & ' ! print a newline character string', & ' write(*,''(*(a))'',advance=''no'') &', & ' nl,''This is record 1.'',nl,''This is record 2.'',nl', & '', & ' ! output a number of words of random length as a paragraph', & ' ! by inserting a new_line before line exceeds 70 characters', & '', & ' ! simplistic paragraph print using non-advancing I/O', & ' count=0', & ' do i=1,100', & '', & ' ! make some fake word of random length', & ' call random_number(r)', & ' string=repeat(''x'',int(r*10)+1)', & '', & ' count=count+len(string)+1', & ' if(count.gt.70)then', & ' write(*,''(a)'',advance=''no'')nl', & ' count=len(string)+1', & ' endif', & ' write(*,''(1x,a)'',advance=''no'')string', & ' enddo', & ' write(*,''(a)'',advance=''no'')nl', & '', & ' end program demo_new_line', & '', & ' Results:', & '', & ' > This is record 1.', & ' > This is record 2.', & ' >', & ' > This is record 1.', & ' > This is record 2.', & ' > x x xxxx xxxxxxx xxxxxxxxxx xxxxxxxxx xxxx xxxxxxxxxx xxxxxxxx', & ' > xxxxxxxxx xxxx xxxxxxxxx x xxxxxxxxx xxxxxxxx xxxxxxxx xxxx x', & ' > xxxxxxxxxx x x x xxxxxx xxxxxxxxxx x xxxxxxxxxx x xxxxxxx xxxxxxxxx', & ' > xx xxxxxxxxxx xxxxxxxx x xx xxxxxxxxxx xxxxxxxx xxx xxxxxxx xxxxxx', & ' > xxxxx xxxxxxxxx x xxxxxxxxxx xxxxxx xxxxxxxx xxxxx xxxxxxxx xxxxxxxx', & ' > xxxxx xxx xxxxxxxx xxxxxxx xxxxxxxx xxx xxxx xxx xxxxxxxx xxxxxx', & ' > xxxxxxx xxxxxxx xxxxx xxxxx xx xxxxxx xx xxxxxxxxxx xxxxxx x xxxx', & ' > xxxxxx xxxxxxx x xxx xxxxx xxxxxxxxx xxx xxxxxxx x xxxxxx xxxxxxxxx', & ' > xxxx xxxxxxxxx xxxxxxxx xxxxxxxx xxx xxxxxxx xxxxxxx xxxxxxxxxx', & ' > xxxxxxxxxx xxxxxx xxxxx xxxx xxxxxxx xx xxxxxxxxxx xxxxxx xxxxxx', & ' > xxxxxx xxxx xxxxx', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' ACHAR(3), CHAR(3), IACHAR(3), ICHAR(3), SELECTED_CHAR_KIND(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 new_line(3fortran)', & ''] shortname="new_line" call process() case('172','nint') textblock=[character(len=256) :: & '', & 'nint(3fortran) nint(3fortran)', & '', & 'NAME', & ' NINT(3) - [TYPE:CONVERSION] Nearest whole number', & '', & 'SYNOPSIS', & ' result = nint( a [,kind] )', & '', & ' elemental integer(kind=KIND) function nint(a, kind )', & '', & ' real(kind=**),intent(in) :: a', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o A is type real of any kind', & '', & ' o KIND is a scalar integer constant expression', & '', & ' o The result is default integer kind or the value of KIND if KIND is', & ' present.', & '', & 'DESCRIPTION', & ' NINT(3) rounds its argument to the nearest whole number with its sign', & ' preserved.', & '', & ' The user must ensure the value is a valid value for the range of the KIND', & ' returned. If the processor cannot represent the result in the kind', & ' specified, the result is undefined.', & '', & ' If A is greater than zero, NINT(A) has the value INT(A+0.5).', & '', & ' If A is less than or equal to zero, NINT(A) has the value INT(A-0.5).', & '', & 'OPTIONS', & ' o A : The value to round to the nearest whole number', & '', & ' o KIND : can specify the kind of the output value. If not present, the', & ' output is the default type of integer.', & '', & 'RESULT', & ' The result is the integer nearest A, or if there are two integers equally', & ' near A, the result is whichever such integer has the greater magnitude.', & '', & ' The result is undefined if it cannot be represented in the specified integer', & ' type.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_nint', & ' implicit none', & ' integer,parameter :: dp=kind(0.0d0)', & ' real,allocatable :: in(:)', & ' integer,allocatable :: out(:)', & ' integer :: i', & ' real :: x4', & ' real(kind=dp) :: x8', & '', & ' ! basic use', & ' x4 = 1.234E0', & ' x8 = 4.721_dp', & ' print *, nint(x4), nint(-x4)', & ' print *, nint(x8), nint(-x8)', & '', & ' ! elemental', & ' in = [ -2.7, -2.5, -2.2, -2.0, -1.5, -1.0, -0.5, -0.4, &', & ' & 0.0, &', & ' & +0.04, +0.5, +1.0, +1.5, +2.0, +2.2, +2.5, +2.7 ]', & ' out = nint(in)', & ' do i=1,size(in)', & ' write(*,*)in(i),out(i)', & ' enddo', & '', & ' ! dusty corners', & ' ISSUES: block', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' integer :: icheck', & ' ! make sure input is in range for the type returned', & ' write(*,*)''Range limits for typical KINDS:''', & ' write(*,''(1x,g0,1x,g0)'') &', & ' & int8,huge(0_int8), &', & ' & int16,huge(0_int16), &', & ' & int32,huge(0_int32), &', & ' & int64,huge(0_int64)', & '', & ' ! the standard does not require this to be an error ...', & ' x8=12345.67e15 ! too big of a number', & ' icheck=selected_int_kind(ceiling(log10(x8)))', & ' write(*,*)''Any KIND big enough? ICHECK='',icheck', & ' print *, ''These are all wrong answers for '',x8', & ' print *, nint(x8,kind=int8)', & ' print *, nint(x8,kind=int16)', & ' print *, nint(x8,kind=int32)', & ' print *, nint(x8,kind=int64)', & ' endblock ISSUES', & '', & ' end program demo_nint', & '', & ' Results:', & '', & ' > 1 -1', & ' > 5 -5', & ' > -2.700000 -3', & ' > -2.500000 -3', & ' > -2.200000 -2', & ' > -2.000000 -2', & ' > -1.500000 -2', & ' > -1.000000 -1', & ' > -0.5000000 -1', & ' > -0.4000000 0', & ' > 0.0000000E+00 0', & ' > 3.9999999E-02 0', & ' > 0.5000000 1', & ' > 1.000000 1', & ' > 1.500000 2', & ' > 2.000000 2', & ' > 2.200000 2', & ' > 2.500000 3', & ' > 2.700000 3', & ' > Range limits for typical KINDS:', & ' > 1 127', & ' > 2 32767', & ' > 4 2147483647', & ' > 8 9223372036854775807', & ' > Any KIND big enough? ICHECK= -1', & ' > These are all wrong answers for 1.234566949990144E+019', & ' > 0', & ' > 0', & ' > -2147483648', & ' > -9223372036854775808', & '', & 'STANDARD', & ' FORTRAN 77 , with KIND argument - Fortran 90', & '', & 'SEE ALSO', & ' AINT(3), ANINT(3), INT(3), SELECTED_INT_KIND(3), CEILING(3), FLOOR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 nint(3fortran)', & ''] shortname="nint" call process() case('173','norm2') textblock=[character(len=256) :: & '', & 'norm2(3fortran) norm2(3fortran)', & '', & 'NAME', & ' NORM2(3) - [MATHEMATICS] Euclidean vector norm', & '', & 'SYNOPSIS', & ' result = norm2(array, [dim])', & '', & ' real(kind=KIND) function norm2(array, dim)', & '', & ' real(kind=KIND),intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & '', & 'CHARACTERISTICS', & ' o ARRAY shall be an array of type real.', & '', & ' o DIM shall be a scalar of type integer', & '', & ' o The result is of the same type as ARRAY.', & '', & 'DESCRIPTION', & ' NORM2(3) calculates the Euclidean vector norm (L_2 norm or generalized L', & ' norm) of ARRAY along dimension DIM.', & '', & 'OPTIONS', & ' o ARRAY : the array of input values for the L_2 norm computations', & '', & ' o DIM : a value in the range from 1 to RANK(ARRAY).', & '', & 'RESULT', & ' If DIM is absent, a scalar with the square root of the sum of squares of the', & ' elements of ARRAY is returned.', & '', & ' Otherwise, an array of rank N-1, where N equals the rank of ARRAY, and a', & ' shape similar to that of ARRAY with dimension DIM dropped is returned.', & '', & ' Case (i) : The result of NORM2 (X) has a value equal to a processor-', & ' dependent approximation to the generalized L norm of X, which is the square', & ' root of the sum of the squares of the elements of X. If X has size zero, the', & ' result has the value zero.', & '', & ' Case (ii) : The result of NORM2 (X, DIM=DIM) has a value equal to that of', & ' NORM2 (X) if X has rank one. Otherwise, the resulting array is reduced in', & ' rank with dimension DIM removed, and each remaining elment is the result of', & ' NORM2(X) for the values along dimension DIM.', & '', & ' It is recommended that the processor compute the result without undue', & ' overflow or underflow.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_norm2', & ' implicit none', & ' integer :: i', & ' real :: x(2,3) = reshape([ &', & ' 1, 2, 3, &', & ' 4, 5, 6 &', & ' ],shape(x),order=[2,1])', & '', & ' write(*,*) ''input in row-column order''', & ' write(*,*) ''x=''', & ' write(*,''(4x,3f4.0)'')transpose(x)', & ' write(*,*)', & ' write(*,*) ''norm2(x)='',norm2(x)', & ' write(*,*) ''which is equivalent to''', & ' write(*,*) ''sqrt(sum(x**2))='',sqrt(sum(x**2))', & ' write(*,*)', & ' write(*,*) ''for reference the array squared is''', & ' write(*,*) ''x**2=''', & ' write(*,''(4x,3f4.0)'')transpose(x**2)', & ' write(*,*)', & ' write(*,*) ''norm2(x,dim=1)='',norm2(x,dim=1)', & ' write(*,*) ''norm2(x,dim=2)='',norm2(x,dim=2)', & ' write(*,*) ''(sqrt(sum(x(:,i)**2)),i=1,3)='',(sqrt(sum(x(:,i)**2)),i=1,3)', & ' write(*,*) ''(sqrt(sum(x(i,:)**2)),i=1,2)='',(sqrt(sum(x(i,:)**2)),i=1,2)', & '', & ' end program demo_norm2', & '', & ' Results:', & '', & ' > input in row-column order', & ' > x=', & ' > 1. 2. 3.', & ' > 4. 5. 6.', & ' >', & ' > norm2(x)= 9.539392', & ' > which is equivalent to', & ' > sqrt(sum(x**2))= 9.539392', & ' >', & ' > for reference the array squared is', & ' > x**2=', & ' > 1. 4. 9.', & ' > 16. 25. 36.', & ' >', & ' > norm2(x,dim=1)= 4.123106 5.385165 6.708204', & ' > norm2(x,dim=2)= 3.741657 8.774964', & ' > (sqrt(sum(x(:,i)**2)),i=1,3)= 4.123106 5.385165 6.708204', & ' > (sqrt(sum(x(i,:)**2)),i=1,2)= 3.741657 8.774964', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' PRODUCT(3), SUM(3), HYPOT(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 norm2(3fortran)', & ''] shortname="norm2" call process() case('174','not') textblock=[character(len=256) :: & '', & 'not(3fortran) not(3fortran)', & '', & 'NAME', & ' NOT(3) - [BIT:LOGICAL] Logical negation; flips all bits in an integer', & '', & 'SYNOPSIS', & ' result = not(i)', & '', & ' elemental integer(kind=KIND) function not(i)', & '', & ' integer(kind=KIND), intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o I may be an integer of any valid kind', & '', & ' o The returned integer is of the same kind as the argument I.', & '', & 'DESCRIPTION', & ' NOT(3) returns the bitwise Boolean inverse of I. This is also known as the', & ' "Bitwise complement" or "Logical negation" of the value.', & '', & ' If an input bit is a one, that position is a zero on output. Conversely any', & ' input bit that is zero is a one on output.', & '', & 'OPTIONS', & ' o I : The value to flip the bits of.', & '', & 'RESULT', & ' The result has the value obtained by complementing I bit-by-bit according to', & ' the following truth table:', & '', & ' > I | NOT(I)', & ' > ----#----------', & ' > 1 | 0', & ' > 0 | 1', & '', & ' That is, every input bit is flipped.', & '', & 'EXAMPLES', & ' Sample program', & '', & ' program demo_not', & ' implicit none', & ' integer :: i', & ' ! basics', & ' i=-13741', & ' print *,''the input value'',i,''represented in bits is''', & ' write(*,''(1x,b32.32,1x,i0)'') i, i', & ' i=not(i)', & ' print *,''on output it is'',i', & ' write(*,''(1x,b32.32,1x,i0)'') i, i', & ' print *, " on a two''s complement machine flip the bits and add 1"', & ' print *, " to get the value with the sign changed, for example."', & ' print *, 1234, not(1234)+1', & ' print *, -1234, not(-1234)+1', & ' print *, " of course ''x=-x'' works just fine and more generally."', & ' end program demo_not', & '', & ' Results:', & '', & ' > the input value -13741 represented in bits is', & ' > 11111111111111111100101001010011 -13741', & ' > on output it is 13740', & ' > 00000000000000000011010110101100 13740', & ' > on a two''s complement machine flip the bits and add 1', & ' > to get the value with the sign changed, for example.', & ' > 1234 -1234', & ' > -1234 1234', & ' > of course ''x=-x'' works just fine and more generally.', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' IAND(3), IOR(3), IEOR(3), IBITS(3), IBSET(3),', & '', & ' IBCLR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 not(3fortran)', & ''] shortname="not" call process() case('175','null') textblock=[character(len=256) :: & '', & 'null(3fortran) null(3fortran)', & '', & 'NAME', & ' NULL(3) - [TRANSFORMATIONAL] Function that returns a disassociated pointer', & '', & 'SYNOPSIS', & ' ptr => null( [mold] )', & '', & ' function null(mold)', & '', & ' type(TYPE(kind=**)),pointer,optional :: mold', & '', & 'CHARACTERISTICS', & ' o MOLD is a pointer of any association status and of any type.', & '', & ' o The result is a disassociated pointer or an unallocated allocatable', & ' entity.', & '', & 'DESCRIPTION', & ' NULL(3) returns a disassociated pointer.', & '', & ' If MOLD is present, a disassociated pointer of the same type is returned,', & ' otherwise the type is determined by context.', & '', & ' In Fortran 95, MOLD is optional. Please note that Fortran 2003 includes', & ' cases where it is required.', & '', & 'OPTIONS', & ' o MOLD : a pointer of any association status and of any type.', & '', & 'RESULT', & ' A disassociated pointer or an unallocated allocatable entity.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' !program demo_null', & ' module showit', & ' implicit none', & ' private', & ' character(len=*),parameter :: g=''(*(g0,1x))''', & ' public gen', & ' ! a generic interface that only differs in the', & ' ! type of the pointer the second argument is', & ' interface gen', & ' module procedure s1', & ' module procedure s2', & ' end interface', & '', & ' contains', & '', & ' subroutine s1 (j, pi)', & ' integer j', & ' integer, pointer :: pi', & ' if(associated(pi))then', & ' write(*,g)''Two integers in S1:,'',j,''and'',pi', & ' else', & ' write(*,g)''One integer in S1:,'',j', & ' endif', & ' end subroutine s1', & '', & ' subroutine s2 (k, pr)', & ' integer k', & ' real, pointer :: pr', & ' if(associated(pr))then', & ' write(*,g)''integer and real in S2:,'',k,''and'',pr', & ' else', & ' write(*,g)''One integer in S2:,'',k', & ' endif', & ' end subroutine s2', & '', & ' end module showit', & '', & ' program demo_null', & ' use showit, only : gen', & '', & ' real,target :: x = 200.0', & ' integer,target :: i = 100', & '', & ' real, pointer :: real_ptr', & ' integer, pointer :: integer_ptr', & '', & ' ! so how do we call S1() or S2() with a disassociated pointer?', & '', & ' ! the answer is the null() function with a mold value', & '', & ' ! since s1() and s2() both have a first integer', & ' ! argument the NULL() pointer must be associated', & ' ! to a real or integer type via the mold option', & ' ! so the following can distinguish whether s1(1)', & ' ! or s2() is called, even though the pointers are', & ' ! not associated or defined', & '', & ' call gen (1, null (real_ptr) ) ! invokes s2', & ' call gen (2, null (integer_ptr) ) ! invokes s1', & ' real_ptr => x', & ' integer_ptr => i', & ' call gen (3, real_ptr ) ! invokes s2', & ' call gen (4, integer_ptr ) ! invokes s1', & '', & ' end program demo_null', & '', & ' Results:', & '', & ' > One integer in S2:, 1', & ' > One integer in S1:, 2', & ' > integer and real in S2:, 3 and 200.000000', & ' > Two integers in S1:, 4 and 100', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' ASSOCIATED(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 null(3fortran)', & ''] shortname="null" call process() case('176','num_images') textblock=[character(len=256) :: & '', & 'num_images(3fortran) num_images(3fortran)', & '', & 'NAME', & ' NUM_IMAGES(3) - [COLLECTIVE] Number of images', & '', & 'SYNOPSIS', & ' result = num_images([team|team_number])', & '', & ' integer function num_images (team)', & '', & ' type(TEAM_TYPE),intent(in),optional :: team', & ' integer(kind=KIND),intent(in),optional :: team_number', & '', & 'CHARACTERISTICS', & ' o use of TEAM and TEAM_NUMBER is mutually exclusive', & '', & ' o TEAM is a scalar of type TEAM_TYPE from the intrinsic module', & ' ISO_FORTRAN_ENV.', & '', & ' o TEAM_NUMBER is an integer scalar.', & '', & ' o the result is a default integer scalar.', & '', & 'DESCRIPTION', & ' NUM_IMAGES(3) Returns the number of images.', & '', & 'OPTIONS', & ' o TEAM : shall be a scalar of type TEAM_TYPE from the intrinsic module', & ' ISO_FORTRAN_ENV, with a value that identifies the current or an ancestor', & ' team.', & '', & ' o TEAM_NUMBER : identifies the initial team or a team whose parent is the', & ' same as that of the current team.', & '', & 'RESULT', & ' The number of images in the specified team, or in the current team if no', & ' team is specified.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_num_images', & ' implicit none', & ' integer :: value[*]', & ' real :: p[*]', & ' integer :: i', & '', & ' value = this_image()', & ' sync all', & ' if (this_image() == 1) then', & ' do i = 1, num_images()', & ' write(*,''(2(a,i0))'') ''value['', i, ''] is '', value[i]', & ' end do', & ' endif', & '', & ' ! The following code uses image 1 to read data and', & ' ! broadcast it to other images.', & ' if (this_image()==1) then', & ' p=1234.5678', & ' do i = 2, num_images()', & ' p[i] = p', & ' end do', & ' end if', & ' sync all', & '', & ' end program demo_num_images', & '', & 'STANDARD', & ' Fortran 2008 . With DISTANCE or FAILED argument, TS 18508', & '', & 'SEE ALSO', & ' THIS_IMAGE(3), IMAGE_INDEX(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 num_images(3fortran)', & ''] shortname="num_images" call process() case('177','open') textblock=[character(len=256) :: & '', & 'open(7fortran) open(7fortran)', & '', & 'NAME', & ' open(7f) - [IO] Initiates or modifies a connection between an external file', & ' and a specified unit.', & '', & 'SYNOPSIS', & ' OPEN (', & '', & ' [ UNIT = ] file-unit-number', & ' ACCESS = scalar-default-char-expr', & ' ACTION = scalar-default-char-expr', & ' ASYNCHRONOUS = scalar-default-char-expr', & ' BLANK = scalar-default-char-expr', & ' DECIMAL = scalar-default-char-expr', & ' DELIM = scalar-default-char-expr', & ' ENCODING = scalar-default-char-expr', & ' ERR = label', & ' FILE = file-name-scalar-default-char-expr', & ' FORM = scalar-default-char-expr', & ' IOMSG = scalar-default-char-variable', & ' IOSTAT = scalar-int-variable', & ' NEWUNIT = scalar-int-variable', & ' PAD = scalar-default-char-expr', & ' POSITION = scalar-default-char-expr', & ' RECL = scalar-int-expr', & ' ROUND = scalar-default-char-expr', & ' SIGN = scalar-default-char-expr', & ' STATUS = scalar-default-char-expr', & '', & ' )', & '', & 'DESCRIPTION', & ' An OPEN statement initiates or modifies the connection between an external', & ' file and a specified unit. The OPEN statement may be used to connect an', & ' existing file to a unit, create a file that is preconnected, create a file', & ' and connect it to a unit, or change certain modes of a connection between a', & ' file and a unit.', & '', & ' An external unit may be connected by an OPEN statement in the main program', & ' or any subprogram and, once connected, a reference to it may appear in any', & ' program unit of the program.', & '', & ' If the file to be connected to the unit does not exist but is the same as', & ' the file to which the unit is preconnected, the modes specified by an OPEN', & ' statement become a part of the connection.', & '', & ' If the file to be connected to the unit is not the same as the file to which', & ' the unit is connected, the effect is as if a CLOSE statement without a', & ' STATUS= specifier had been executed for the unit immediately prior to the', & ' execution of an OPEN statement.', & '', & ' If a unit is connected to a file that exists, execution of an OPEN statement', & ' for that unit is permitted. If the FILE= specifier is not included in such', & ' an OPEN statement, the file to be connected to the unit is the same as the', & ' file to which the unit is already connected.', & '', & ' If the file to be connected to the unit is the same as the file to which the', & ' unit is connected, only the specifiers for changeable modes (9.5.2) may have', & ' values different from those currently in effect. If the POSITION= specifier', & ' appears in such an OPEN statement, the value specified shall not disagree', & ' with the current position of the file. If the STATUS= specifier is included', & ' in such an OPEN statement, it shall be specified with the value OLD.', & ' Execution of such an OPEN statement causes any new values of the specifiers', & ' for changeable modes to be in effect, but does not cause any change in any', & ' of the unspecified specifiers and the position of the file is unaffected.', & ' The ERR=, IOSTAT=, and IOMSG= specifiers from any previously executed OPEN', & ' statement have no effect on any currently executed OPEN statement.', & '', & ' A STATUS= specifier with a value of OLD is always allowed when the file to', & ' be connected to the unit is the same as the file to which the unit is', & ' connected. In this case, if the status of the file was SCRATCH before', & ' execution of the OPEN statement, the file will still be deleted when the', & ' unit is closed, and the file is still considered to have a status of', & ' SCRATCH.', & '', & ' If a file is already connected to a unit, an OPEN statement on that file', & ' with a different unit shall not be executed.', & '', & 'OPTIONS', & ' A specifier that requires a scalar-default-char-expr may have a limited list', & ' of character values. These values are listed for each such specifier. Any', & ' trailing blanks are ignored. The value specified is without regard to case.', & ' Some specifiers have a default value if the specifier is omitted. No', & ' specifier shall appear more than once in a given connect-spec-list.', & '', & ' If the NEWUNIT= specifier does not appear, a file-unit-number shall be', & ' specified; if the optional characters UNIT= are omitted, the file-unit-', & ' number shall be the first item in the connect-spec-list.', & '', & ' The label used in the ERR= specifier shall be the statement label of a', & ' branch target statement that appears in the same scoping unit as the OPEN', & ' statement.', & '', & ' If a NEWUNIT= specifier appears, a file-unit-number shall not appear.', & '', & ' IOSTAT=, ERR=, and IOMSG= specifiers are described in 9.11.', & '', & 'KEYWORDS', & ' ACCESS : The scalar-default-char-expr shall evaluate to SEQUENTIAL, DIRECT,', & ' or STREAM. The ACCESS= specifier specifies the access method for the', & ' connection of the file as being sequential, direct, or stream. If this', & ' specifier is omitted, the default value is SEQUENTIAL. For an existing file,', & ' the specified access method shall be included in the set of allowed access', & ' methods for the file. For a new file, the processor creates the file with a', & ' set of allowed access methods that includes the specified method.', & '', & ' ACTION : The scalar-default-char-expr shall evaluate to READ, WRITE, or', & ' READWRITE. READ specifies that the WRITE, PRINT, and ENDFILE statements', & ' shall not refer to this connection. WRITE specifies that READ statements', & ' shall not refer to this connection. READWRITE permits any input/output', & ' statements to refer to this connection. If this specifier is omitted, the', & ' default value is processor dependent. If READWRITE is included in the set of', & ' allowable actions for a file, both READ and WRITE also shall be included in', & ' the set of allowed actions for that file. For an existing file, the', & ' specified action shall be included in the set of allowed actions for the', & ' file. For a new file, the processor creates the file with a set of allowed', & ' actions that includes the specified action.', & '', & ' ASYNCHRONOUS : The scalar-default-char-expr shall evaluate to YES or NO. If', & ' YES is specified, asynchronous input/output on the unit is allowed. If NO', & ' is specified, asynchronous input/output on the unit is not allowed. If this', & ' specifier is omitted, the default value is NO.', & '', & ' BLANK : The scalar-default-char-expr shall evaluate to NULL or ZERO. The', & ' BLANK= specifier is permitted only for a connection for formatted', & ' input/output. It specifies the current value of the blank interpretation', & ' mode (10.8.6, 9.6.2.6) for input for this connection. This mode has no', & ' effect on output. It is a changeable mode (9.5.2). If this specifier is', & ' omitted in an OPEN statement that initiates a connection, the default value', & ' is NULL.', & '', & ' DECIMAL : The scalar-default-char-expr shall evaluate to COMMA or POINT.', & ' The DECIMAL= specifier is permitted only for a connection for formatted', & ' input/output. It specifies the current value of the decimal edit mode (10.6,', & ' 10.8.8, 9.6.2.7) for this connection. This is a changeable mode (9.5.2). If', & ' this specifier is omitted in an OPEN statement that initiates a connection,', & ' the default value is POINT.', & '', & ' DELIM : The scalar-default-char-expr shall evaluate to APOSTROPHE, QUOTE, or', & ' NONE. The DELIM= specifier is permitted only for a connection for formatted', & ' input/output. It specifies the current value of the delimiter mode (9.6.2.8)', & ' for list-directed (10.10.4) and namelist (10.11.4.2) output for the', & ' connection. This mode has no effect on input. It is a changeable mode', & ' (9.5.2). If this specifier is omitted in an OPEN statement that initiates a', & ' connection, the default value is NONE.', & '', & ' ENCODING : The scalar-default-char-expr shall evaluate to UTF-8 or DEFAULT.', & ' The ENCODING= specifier is permitted only for a connection for formatted', & ' input/output. The value UTF-8 specifies that the encoding form of the file', & ' is UTF-8 as specified by ISO/IEC 10646-1:2000. Such a file is called a', & ' Unicode file, and all characters therein are of ISO 10646 character type.', & ' The value UTF-8 shall not be specified if the processor does not support the', & ' ISO 10646 character type. The value DEFAULT specifies that the encoding form', & ' of the file is processor-dependent. If this specifier is omitted in an OPEN', & ' statement that initiates a connection, the default value is DEFAULT.', & '', & ' FILE : The value of the FILE= specifier is the name of the file to be', & ' connected to the specified unit. Any trailing blanks are ignored. The file-', & ' name-expr shall be a name that is allowed by the processor. If this', & ' specifier is omitted and the unit is not connected to a file, the STATUS=', & ' specifier shall be specified with a value of SCRATCH; in this case, the', & ' connection is made to a processor-dependent file. The interpretation of case', & ' is processor dependent.', & '', & ' FORM : The scalar-default-char-expr shall evaluate to FORMATTED or', & ' UNFORMATTED. The FORM= specifier determines whether the file is being', & ' connected for formatted or unformatted input/output. If this specifier is', & ' omitted, the default value is UNFORMATTED if the file is being connected for', & ' direct access or stream access, and the default value is FORMATTED if the', & ' file is being connected for sequential access. For an existing file, the', & ' specified form shall be included in the set of allowed forms for the file.', & ' For a new file, the processor creates the file with a set of allowed forms', & ' that includes the specified form.', & '', & ' NEWUNIT : If the NEWUNIT= specifier appears in an OPEN statement, either the', & ' FILE= specifier shall appear, or the STATUS= specifier shall appear with a', & ' value of SCRATCH. The unit identified by a NEWUNIT value shall not be', & ' preconnected.', & '', & ' The variable is defined with a processor determined NEWUNIT value if no', & ' error occurs during the execution of the OPEN statement. If an error occurs,', & ' the processor shall not change the value of the variable.', & '', & ' A NEWUNIT value is a negative number, and shall not be equal to -1, any of', & ' the named constants ERROR_UNIT, INPUT_UNIT, or OUTPUT_UNIT from the', & ' intrinsic module ISO_FORTRAN_ENV (13.8.2), any value used by the processor', & ' for the unit argument to a defined input/output procedure, nor any previous', & ' NEWUNIT value that identifies a file that is currently connected.', & '', & ' PAD : The scalar-default-char-expr shall evaluate to YES or NO. The PAD=', & ' specifier is permitted only for a connection for formatted input/output. It', & ' specifies the current value of the pad mode (9.6.4.4.3, 9.6.2.10) for input', & ' for this connection. This mode has no effect on output. It is a changeable', & ' mode (9.5.2). If this specifier is omitted in an OPEN statement that', & ' initiates a connection, the default value is YES.', & '', & ' POSITION : The scalar-default-char-expr shall evaluate to ASIS, REWIND, or', & ' APPEND. The connection shall be for sequential or stream access. A new file', & ' is positioned at its initial point. REWIND positions an existing file at its', & ' initial point. APPEND positions an existing file such that the endfile', & ' record is the next record, if it has one. If an existing file does not have', & ' an endfile record, APPEND positions the file at its terminal point. ASIS', & ' leaves the position unchanged if the file exists and already is connected.', & ' ASIS leaves the position unspecified if the file exists but is not', & ' connected. If this specifier is omitted, the default value is ASIS.', & '', & ' RECL : The value of the RECL= specifier shall be positive. It specifies the', & ' length of each record in a file being connected for direct access, or', & ' specifies the maximum length of a record in a file being connected for', & ' sequential access. This specifier shall not appear when a file is being', & ' connected for stream access. This specifier shall appear when a file is', & ' being connected for direct access. If this specifier is omitted when a file', & ' is being connected for sequential access, the default value is processor', & ' dependent. If the file is being connected for formatted input/output, the', & ' length is the number of characters for all records that contain only', & ' characters of default kind. When a record contains any nondefault', & ' characters, the effect of the RECL= specifier is processor dependent. If the', & ' file is being connected for unformatted input/output, the length is measured', & ' in file storage units. For an existing file, the value of the RECL=', & ' specifier shall be included in the set of allowed record lengths for the', & ' file. For a new file, the processor creates the file with a set of allowed', & ' record lengths that includes the specified value.', & '', & ' ROUND : The scalar-default-char-expr shall evaluate to one of UP, DOWN,', & ' ZERO, NEAREST, COMPATIBLE, or PROCESSOR DEFINED. The ROUND= specifier is', & ' permitted only for a connection for formatted input/output. It specifies the', & ' current value of the I/O rounding mode for this connection. This is a', & ' changeable mode. If this specifier is omitted in an OPEN statement that', & ' initiates a connection, the I/O rounding mode is processor dependent; it', & ' shall be one of the above modes.', & '', & ' A processor is free to select any I/O rounding mode for the default mode.', & ' The mode might correspond to UP, DOWN, ZERO, NEAREST, or COMPATIBLE; or it', & ' might be a completely different I/O rounding mode.', & '', & ' SIGN : The scalar-default-char-expr shall evaluate to one of PLUS, SUPPRESS,', & ' or PROCESSOR DEFINED. The SIGN= specifier is permitted only for a connection', & ' for formatted input/output. It specifies the current value of the sign mode', & ' this connection. This is a changeable mode. If this specifier is omitted in', & ' an OPEN statement that initiates a connection, the default value is', & ' PROCESSOR DEFINED.', & '', & ' STATUS : If the STATUS= specifier has the value NEW or REPLACE, the FILE=', & ' specifier shall appear. If the STATUS= specifier has the value SCRATCH, the', & ' FILE= specifier shall not appear. If the STATUS= specifier has the value', & ' OLD, the FILE= specifier shall appear unless the unit is connected and the', & ' file connected to the unit exists.', & '', & ' The scalar-default-char-expr shall evaluate to OLD, NEW, SCRATCH, REPLACE,', & ' or UNKNOWN. If OLD is specified, the file shall exist. If NEW is specified,', & ' the file shall not exist.', & '', & ' Successful execution of an OPEN statement with NEW specified creates the', & ' file and changes the status to OLD. If REPLACE is specified and the file', & ' does not already exist, the file is created and the status is changed to', & ' OLD. If REPLACE is specified and the file does exist, the file is deleted, a', & ' new file is created with the same name, and the status is changed to OLD. If', & ' SCRATCH is specified, the file is created and connected to the specified', & ' unit for use by the program but is deleted at the execution of a CLOSE', & ' statement referring to the same unit or at the normal termination of the', & ' program.', & '', & ' SCRATCH shall not be specified with a named file.', & '', & ' If UNKNOWN is specified, the status is processor dependent. If this', & ' specifier is omitted, the default value is UNKNOWN.', & '', & 'EXAMPLES', & ' An example of an OPEN statement is:', & '', & ' program demo_open', & ' integer :: ios', & ' character(len=256) :: message', & ' integer :: lun', & ' open ( &', & ' & newunit=lun, &', & ' & file=''employee.names'', &', & ' & action=''read'', &', & ' & iostat=ios, &', & ' & iomsg=message)', & ' if (ios < 0) then', & ' ! Perform end-of-file processing on the file connected to unit', & ' call end_processing()', & ' elseif (ios > 0) then', & ' ! Perform error processing', & ' write(*,''(a)'')trim(message)', & ' call error_processing()', & ' stop', & ' else', & ' write(*,*)''OPENED FILE''', & ' endif', & ' contains', & ' !', & ' subroutine end_processing()', & ' write(*,*)''END OF FILE:'',ios,''MESSAGE='',trim(message)', & ' close(unit=lun,iostat=ios)', & ' stop', & ' end subroutine end_processing', & ' !', & ' subroutine error_processing()', & ' write(*,*)''ERROR:'',ios,''MESSAGE='',trim(message)', & ' close(unit=lun,iostat=ios)', & ' stop', & ' end subroutine error_processing', & ' !', & ' end program demo_open', & '', & 'SEE ALSO', & ' BACKSPACE(7), CLOSE(7), ENDFILE(7), FLUSH(7), INQUIRE(7), OPEN(7), PRINT(7),', & ' READ(7), REWIND(7), WAIT(7), WRITE(7)', & '', & ' March 16, 2025 open(7fortran)', & ''] shortname="open" call process() case('178','out_of_range') textblock=[character(len=256) :: & '', & 'out_of_range(3fortran) out_of_range(3fortran)', & '', & 'NAME', & ' OUT_OF_RANGE(3) - [TYPE:CONVERSION] Whether a numeric value can be converted', & ' safely to another type', & '', & 'SYNOPSIS', & ' result = out_of_range (x, mold [, round])', & '', & ' elemental logical function(x, mold, round)', & '', & ' type(TYPE(kind=**)),intent(in) :: x', & ' type(TYPE(kind=**)),intent(in) :: mold', & ' logical,intent(in),optional :: round', & '', & 'CHARACTERISTICS', & ' o X is of type integer or real.', & '', & ' o MOLD is an integer or real scalar.', & '', & ' o ROUND is a logical scalar.', & '', & ' o the result is a default logical.', & '', & 'DESCRIPTION', & ' OUT_OF_RANGE(3) determines whether a value X can be converted safely to a', & ' real or integer variable the same type and kind as MOLD.', & '', & ' For example, if INT8 is the KIND name for an 8-bit binary integer type, then', & ' for', & '', & ' logical :: L1, L2', & ' L1=out_of_range(-128.5, 0_int8)', & ' L2=out_of_range(-128.5, 0_int8,.true.)', & ' end', & '', & ' L1 likely will have the value .FALSE. because the value will be truncated to', & ' -128.0, which is a representable integer number on a two''s complement', & ' machine.', & '', & ' L2 will be .TRUE. because it will be rounded to -129.0, which is not likely', & ' to be a representable eight-bit integer.', & '', & 'OPTIONS', & ' o X : a scalar to be tested for whether it can be stored in a variable of', & ' the type and kind of MOLD', & '', & ' o MOLD : the type and kind of the variable (but not the value) is used to', & ' identify the characteristics of the variable type to fit X into.', & '', & ' o ROUND : flag whether to round the value of X before validating it as a', & ' value like MOLD.', & '', & ' ROUND can only be present if X is of type real and MOLD is of type', & ' integer.', & '', & 'RESULT', & ' From the standard:', & '', & ' Case (i): If MOLD is of type integer, and ROUND is absent or present with', & ' the value false, the result is true if and only if the value of X is an IEEE', & ' infinity or NaN, or if the integer with largest magnitude that lies between', & ' zero and X inclusive is not representable by objects with the type and kind', & ' of MOLD.', & '', & ' Case (ii): If MOLD is of type integer, and ROUND is present with the value', & ' true, the result is true if and only if the value of X is an IEEE infinity', & ' or NaN, or if the integer nearest X, or the integer of greater magnitude if', & ' two integers are equally near to X, is not representable by objects with the', & ' type and kind of MOLD.', & '', & ' Case (iii): Otherwise, the result is true if and only if the value of X is', & ' an IEEE infinity or NaN that is not supported by objects of the type and', & ' kind of MOLD, or if X is a finite number and the result of rounding the', & ' value of X (according to the IEEE rounding mode if appropriate) to the', & ' extended model for the kind of MOLD has magnitude larger than that of the', & ' largest finite number with the same sign as X that is representable by', & ' objects with the type and kind of MOLD.', & '', & 'NOTE', & ' MOLD is required to be a scalar because the only information taken from it', & ' is its type and kind. Allowing an array MOLD would require that it be', & ' conformable with X. ROUND is scalar because allowing an array rounding mode', & ' would have severe performance difficulties on many processors.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_out_of_range', & ' use, intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' integer :: i', & ' integer(kind=int8) :: i8, j8', & '', & ' ! compilers are not required to produce an error on out of range.', & ' ! here storing the default integers into 1-byte integers', & ' ! incorrectly can have unexpected results', & ' do i=127,130', & ' i8=i', & ' j8=-i', & ' ! OUT_OF_RANGE(3) can let you check if the value will fit', & ' write(*,*)i8,j8,'' might have expected'',i,-i, &', & ' & out_of_range( i,i8), &', & ' & out_of_range(-i,i8)', & ' enddo', & ' write(*,*) ''RANGE IS '',-1-huge(0_int8),''TO'',huge(0_int8)', & ' ! the real -128.5 is truncated to -128 and is in range', & ' write(*,*) out_of_range ( -128.5, 0_int8) ! false', & '', & ' ! the real -128.5 is rounded to -129 and is not in range', & ' write(*,*) out_of_range ( -128.5, 0_int8, .true.) ! true', & '', & ' end program demo_out_of_range', & '', & ' Results:', & '', & ' > 127 -127 might have expected 127 -127 F F', & ' > -128 -128 might have expected 128 -128 T F', & ' > -127 127 might have expected 129 -129 T T', & ' > -126 126 might have expected 130 -130 T T', & ' > RANGE IS -128 TO 127', & ' > F', & ' > T', & '', & 'STANDARD', & ' FORTRAN 2018', & '', & 'SEE ALSO', & ' o AIMAG(3) - Imaginary part of complex number', & '', & ' o CMPLX(3) - Convert values to a complex type', & '', & ' o DBLE(3) - Double conversion function', & '', & ' o INT(3) - Truncate towards zero and convert to integer', & '', & ' o NINT(3) - Nearest whole number', & '', & ' o REAL(3) - Convert to real type', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 out_of_range(3fortran)', & ''] shortname="out_of_range" call process() case('179','pack') textblock=[character(len=256) :: & '', & 'pack(3fortran) pack(3fortran)', & '', & 'NAME', & ' PACK(3) - [ARRAY:CONSTRUCTION] Pack an array into an array of rank one', & '', & 'SYNOPSIS', & ' result = pack( array, mask [,vector] )', & '', & ' TYPE(kind=KIND) function pack(array,mask,vector)', & '', & ' TYPE(kind=KIND),option(in) :: array(..)', & ' logical :: mask(..)', & ' TYPE(kind=KIND),option(in),optional :: vector(*)', & '', & 'CHARACTERISTICS', & ' o ARRAY is an array of any type', & '', & ' o MASK a logical scalar as well as an array conformable with ARRAY.', & '', & ' o VECTOR is of the same kind and type as ARRAY and of rank one', & '', & ' o the returned value is of the same kind and type as ARRAY', & '', & 'DESCRIPTION', & ' PACK(3) stores the elements of ARRAY in an array of rank one.', & '', & ' The beginning of the resulting array is made up of elements whose MASK', & ' equals .true.. Afterwards, remaining positions are filled with elements', & ' taken from VECTOR', & '', & 'OPTIONS', & ' o ARRAY : The data from this array is used to fill the resulting vector', & '', & ' o MASK : the logical mask must be the same size as ARRAY or, alternatively,', & ' it may be a logical scalar.', & '', & ' o VECTOR : an array of the same type as ARRAY and of rank one. If present,', & ' the number of elements in VECTOR shall be equal to or greater than the', & ' number of true elements in MASK. If MASK is scalar, the number of', & ' elements in VECTOR shall be equal to or greater than the number of', & ' elements in ARRAY.', & '', & ' VECTOR shall have at least as many elements as there are in ARRAY.', & '', & 'RESULT', & ' The result is an array of rank one and the same type as that of ARRAY. If', & ' VECTOR is present, the result size is that of VECTOR, the number of .true.', & ' values in MASK otherwise.', & '', & ' If MASK is scalar with the value .true., in which case the result size is', & ' the size of ARRAY.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_pack', & ' implicit none', & ' integer, allocatable :: m(:)', & ' character(len=10) :: c(4)', & '', & ' ! gathering nonzero elements from an array:', & ' m = [ 1, 0, 0, 0, 5, 0 ]', & ' write(*, fmt="(*(i0, '' ''))") pack(m, m /= 0)', & '', & ' ! Gathering nonzero elements from an array and appending elements', & ' ! from VECTOR till the size of the mask array (or array size if the', & ' ! mask is scalar):', & ' m = [ 1, 0, 0, 2 ]', & ' write(*, fmt="(*(i0, '' ''))") pack(m, m /= 0, [ 0, 0, 3, 4 ])', & ' write(*, fmt="(*(i0, '' ''))") pack(m, m /= 0 )', & '', & ' ! select strings whose second character is "a"', & ' c = [ character(len=10) :: ''ape'', ''bat'', ''cat'', ''dog'']', & ' write(*, fmt="(*(g0, '' ''))") pack(c, c(:)(2:2) == ''a'' )', & '', & ' ! creating a quicksort using PACK(3f)', & ' block', & ' intrinsic random_seed, random_number', & ' real :: x(10)', & ' call random_seed()', & ' call random_number(x)', & ' write (*,"(a10,*(1x,f0.3))") "initial",x', & ' write (*,"(a10,*(1x,f0.3))") "sorted",qsort(x)', & ' endblock', & ' contains', & ' !', & ' ! concise quicksort from @arjen and @beliavsky shows recursion,', & ' ! array sections, and vectorized comparisons.', & ' !', & ' pure recursive function qsort(values) result(sorted)', & ' intrinsic pack, size', & ' real, intent(in) :: values(:)', & ' real :: sorted(size(values))', & ' if (size(values) > 1) then', & ' sorted = &', & ' & [qsort(pack(values(2:),values(2:)<values(1))), values(1), &', & ' & qsort(pack(values(2:),values(2:)>=values(1)))]', & ' else', & ' sorted = values', & ' endif', & ' end function qsort', & ' end program demo_pack', & '', & ' Result:', & '', & ' > 1 5', & ' > 1 2 3 4', & ' > 1 2', & ' > bat cat', & ' > initial .833 .367 .958 .454 .122 .602 .418 .942 .566 .400', & ' > sorted .122 .367 .400 .418 .454 .566 .602 .833 .942 .958', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' MERGE(3), SPREAD(3), UNPACK(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 pack(3fortran)', & ''] shortname="pack" call process() case('180','parity') textblock=[character(len=256) :: & '', & 'parity(3fortran) parity(3fortran)', & '', & 'NAME', & ' PARITY(3) - [ARRAY:REDUCTION] Array reduction by .NEQV. operation', & '', & 'SYNOPSIS', & ' result = parity( mask [,dim] )', & '', & ' logical(kind=KIND) function parity(mask, dim)', & '', & ' type(logical(kind=KIND)),intent(in) :: mask(..)', & ' type(integer(kind=**)),intent(in),optional :: dim', & '', & 'CHARACTERISTICS', & ' o MASK is a logical array', & '', & ' o DIM is an integer scalar', & '', & ' o the result is of type logical with the same kind type parameter as MASK.', & ' It is a scalar if DIM does not appear; otherwise it is the rank and shape', & ' of MASK with the dimension specified by DIM removed.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' PARITY(3) calculates the parity array (i.e. the reduction using .neqv.) of', & ' MASK along dimension DIM if DIM is present and not 1. Otherwise, it returns', & ' the parity of the entire MASK array as a scalar.', & '', & 'OPTIONS', & ' o MASK : Shall be an array of type logical.', & '', & ' o DIM : (Optional) shall be a scalar of type integer with a value in the', & ' range from 1 to n, where n equals the rank of MASK.', & '', & 'RESULT', & ' The result is of the same type as MASK.', & '', & ' If DIM is absent, a scalar with the parity of all elements in MASK is', & ' returned: .true. if an odd number of elements are .true. and .false.', & ' otherwise.', & '', & ' If MASK has rank one, PARITY (MASK, DIM) is equal to PARITY (MASK).', & ' Otherwise, the result is an array of parity values with dimension DIM', & ' dropped.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_parity', & ' implicit none', & ' logical, parameter :: T=.true., F=.false.', & ' logical :: x(3,4)', & ' ! basics', & ' print *, parity([T,F])', & ' print *, parity([T,F,F])', & ' print *, parity([T,F,F,T])', & ' print *, parity([T,F,F,T,T])', & ' x(1,:)=[T,T,T,T]', & ' x(2,:)=[T,T,T,T]', & ' x(3,:)=[T,T,T,T]', & ' print *, parity(x)', & ' print *, parity(x,dim=1)', & ' print *, parity(x,dim=2)', & ' end program demo_parity', & '', & ' Results:', & '', & ' > T', & ' > T', & ' > F', & ' > T', & ' > F', & ' > T T T T', & ' > F F F', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' o ALL(3) - Determines if all the values are true', & '', & ' o ANY(3) - Determines if any of the values in the logical array are .true.', & '', & ' o COUNT(3) - Count true values in an array', & '', & ' o SUM(3) - Sum the elements of an array', & '', & ' o MAXVAL(3) - Determines the maximum value in an array or row', & '', & ' o MINVAL(3) - Minimum value of an array', & '', & ' o PRODUCT(3) - Product of array elements', & '', & ' o REDUCE(3) - General array reduction', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 parity(3fortran)', & ''] shortname="parity" call process() case('181','popcnt') textblock=[character(len=256) :: & '', & 'popcnt(3fortran) popcnt(3fortran)', & '', & 'NAME', & ' POPCNT(3) - [BIT:COUNT] Number of bits set', & '', & 'SYNOPSIS', & ' result = popcnt(i)', & '', & ' elemental integer function popcnt(i)', & '', & ' integer(kind=KIND), intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o I may be an integer of any kind.', & '', & ' o The return value is an integer of the default integer kind.', & '', & 'DESCRIPTION', & ' POPCNT(3) returns the number of bits set to one in the binary representation', & ' of an integer.', & '', & 'OPTIONS', & ' o I : value to count set bits in', & '', & 'RESULT', & ' The number of bits set to one in I.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_popcnt', & ' use, intrinsic :: iso_fortran_env, only : integer_kinds, &', & ' & int8, int16, int32, int64', & ' implicit none', & ' character(len=*),parameter :: pretty=''(b64,1x,i0)''', & ' ! basic usage', & ' print pretty, 127, popcnt(127)', & ' print pretty, int(b"01010"), popcnt(int(b"01010"))', & '', & ' ! any kind of an integer can be used', & ' print pretty, huge(0_int8), popcnt(huge(0_int8))', & ' print pretty, huge(0_int16), popcnt(huge(0_int16))', & ' print pretty, huge(0_int32), popcnt(huge(0_int32))', & ' print pretty, huge(0_int64), popcnt(huge(0_int64))', & ' end program demo_popcnt', & '', & ' Results:', & '', & ' Note that on most machines the first bit is the sign bit, and a zero is used', & ' for positive values; but that this is system-dependent. These are typical', & ' values, where the huge(3) function has set all but the first bit to 1.', & '', & ' > 1111111 7', & ' > 1010 2', & ' > 1111111 7', & ' > 111111111111111 15', & ' > 1111111111111111111111111111111 31', & ' > 111111111111111111111111111111111111111111111111111111111111111 63', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' There are many procedures that operator or query values at the bit level:', & '', & ' POPPAR(3), LEADZ(3), TRAILZ(3) ATOMIC_AND(3), ATOMIC_FETCH_AND(3),', & ' ATOMIC_FETCH_OR(3), ATOMIC_FETCH_XOR(3), ATOMIC_OR(3), ATOMIC_XOR(3),', & ' BGE(3), BGT(3), BIT_SIZE(3), BLE(3), BLT(3), BTEST(3), DSHIFTL(3),', & ' DSHIFTR(3), IALL(3), IAND(3), IANY(3), IBCLR(3), IBITS(3), IBSET(3),', & ' IEOR(3), IOR(3), IPARITY(3), ISHFTC(3), ISHFT(3), MASKL(3), MASKR(3),', & ' MERGE_BITS(3), MVBITS(3), NOT(3), SHIFTA(3), SHIFTL(3), SHIFTR(3),', & ' STORAGE_SIZE(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 popcnt(3fortran)', & ''] shortname="popcnt" call process() case('182','poppar') textblock=[character(len=256) :: & '', & 'poppar(3fortran) poppar(3fortran)', & '', & 'NAME', & ' POPPAR(3) - [BIT:COUNT] Parity of the number of bits set', & '', & 'SYNOPSIS', & ' result = poppar(i)', & '', & ' elemental integer function poppar(i)', & '', & ' integer(kind=KIND), intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o I is an integer of any kind', & '', & ' o the return value is a default kind integer', & '', & 'DESCRIPTION', & ' POPPAR(3) returns the parity of an integer''s binary representation (i.e.,', & ' the parity of the number of bits set).', & '', & ' The parity is expressed as', & '', & ' o 0 (zero) if I has an even number of bits set to 1.', & '', & ' o 1 (one) if the number of bits set to one 1 is odd,', & '', & 'OPTIONS', & ' o I : The value to query for its bit parity', & '', & 'RESULT', & ' The return value is equal to 0 if I has an even number of bits set and 1 if', & ' an odd number of bits are set.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_poppar', & ' use, intrinsic :: iso_fortran_env, only : integer_kinds, &', & ' & int8, int16, int32, int64', & ' implicit none', & ' character(len=*),parameter :: pretty=''(b64,1x,i0)''', & ' ! basic usage', & ' print pretty, 127, poppar(127)', & ' print pretty, 128, poppar(128)', & ' print pretty, int(b"01010"), poppar(int(b"01010"))', & '', & ' ! any kind of an integer can be used', & ' print pretty, huge(0_int8), poppar(huge(0_int8))', & ' print pretty, huge(0_int16), poppar(huge(0_int16))', & ' print pretty, huge(0_int32), poppar(huge(0_int32))', & ' print pretty, huge(0_int64), poppar(huge(0_int64))', & ' end program demo_poppar', & '', & ' Results:', & '', & ' > 1111111 1', & ' > 10000000 1', & ' > 1010 0', & ' > 1111111111111111111111111111111 1', & ' > 1111111 1', & ' > 111111111111111 1', & ' > 1111111111111111111111111111111 1', & ' > 111111111111111111111111111111111111111111111111111111111111111 1', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' There are many procedures that operator or query values at the bit level:', & '', & ' POPCNT(3), LEADZ(3), TRAILZ(3) ATOMIC_AND(3), ATOMIC_FETCH_AND(3),', & ' ATOMIC_FETCH_OR(3), ATOMIC_FETCH_XOR(3), ATOMIC_OR(3), ATOMIC_XOR(3),', & ' BGE(3), BGT(3), BIT_SIZE(3), BLE(3), BLT(3), BTEST(3), DSHIFTL(3),', & ' DSHIFTR(3), IALL(3), IAND(3), IANY(3), IBCLR(3), IBITS(3), IBSET(3),', & ' IEOR(3), IOR(3), IPARITY(3), ISHFTC(3), ISHFT(3), MASKL(3), MASKR(3),', & ' MERGE_BITS(3), MVBITS(3), NOT(3), SHIFTA(3), SHIFTL(3), SHIFTR(3),', & ' STORAGE_SIZE(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 poppar(3fortran)', & ''] shortname="poppar" call process() case('183','precision') textblock=[character(len=256) :: & '', & 'precision(3fortran) precision(3fortran)', & '', & 'NAME', & ' PRECISION(3) - [MODEL:NUMERIC] Decimal precision of a real kind', & '', & 'SYNOPSIS', & ' result = precision(x)', & '', & ' integer function precision(x)', & '', & ' TYPE(kind=**),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X shall be of type real or complex. It may be a scalar or an array.', & '', & ' o the result is a default integer scalar.', & '', & 'DESCRIPTION', & ' PRECISION(3) returns the decimal precision in the model of the type of X.', & '', & 'OPTIONS', & ' o X : the type and kind of the argument are used to determine which number', & ' model to query. The value of the argument is not unused; it may even be', & ' undefined.', & '', & 'RESULT', & ' The precision of values of the type and kind of X', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_precision', & ' use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32', & ' implicit none', & ' real(kind=sp) :: x(2)', & ' complex(kind=dp) :: y', & '', & ' print *, precision(x), range(x)', & ' print *, precision(y), range(y)', & '', & ' end program demo_precision', & '', & ' Results:', & '', & ' > 6 37', & ' > 15 307', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), RADIX(3), RANGE(3), RRSPACING(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 precision(3fortran)', & ''] shortname="precision" call process() case('184','present') textblock=[character(len=256) :: & '', & 'present(3fortran) present(3fortran)', & '', & 'NAME', & ' PRESENT(3) - [STATE:INQUIRY] Determine whether an optional dummy argument is', & ' specified', & '', & 'SYNOPSIS', & ' result = present(a)', & '', & ' logical function present (a)', & '', & ' type(TYPE(kind=KIND)) :: a(..)', & '', & 'CHARACTERISTICS', & ' o A May be of any type and may be a pointer, scalar or array value, or a', & ' dummy procedure.', & '', & 'DESCRIPTION', & ' PRESENT(3) can be used in a procedure to determine if an optional dummy', & ' argument was present on the current call to the procedure.', & '', & ' A shall be the name of an optional dummy argument that is accessible in the', & ' subprogram in which the PRESENT(3) function reference appears. There are no', & ' other requirements on A.', & '', & ' Note when an argument is not present when the current procedure is invoked,', & ' you may only pass it as an optional argument to another procedure or pass it', & ' as an argument to PRESENT.', & '', & 'OPTIONS', & ' o A : the name of an optional dummy argument accessible within the current', & ' subroutine or function.', & '', & 'RESULT', & ' Returns .true. if the optional argument A is present (was passed on the call', & ' to the procedure) , or .false. otherwise.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_present', & ' implicit none', & ' integer :: answer', & ' ! argument to func() is not present', & ' answer=func()', & ' write(*,*) answer', & ' ! argument to func() is present', & ' answer=func(1492)', & ' write(*,*) answer', & ' contains', & ' !', & ' integer function func(x)', & ' ! the optional characteristic on this definition allows this variable', & ' ! to not be specified on a call; and also allows it to subsequently', & ' ! be passed to PRESENT(3):', & ' integer, intent(in), optional :: x', & ' integer :: x_local', & ' !', & ' ! basic', & ' if(present(x))then', & ' ! if present, you can use x like any other variable.', & ' x_local=x', & ' else', & ' ! if not, you cannot define or reference x except to', & ' ! pass it as an optional parameter to another procedure', & ' ! or in a call to present(3)', & ' x_local=0', & ' endif', & ' !', & ' func=x_local**2', & ' !', & ' ! passing the argument on to other procedures', & ' ! so something like this is a bad idea because x is used', & ' ! as the first argument to merge(3) when it might not be', & ' ! present', & ' ! xlocal=merge(x,0,present(x)) ! NO!!', & ' !', & ' ! We can pass it to another procedure if another', & ' ! procedure declares the argument as optional as well,', & ' ! or we have tested that X is present', & ' call tattle(''optional argument x'',x)', & ' if(present(x))call not_optional(x)', & ' end function', & ' !', & ' subroutine tattle(label,arg)', & ' character(len=*),intent(in) :: label', & ' integer,intent(in),optional :: arg', & ' if(present(arg))then', & ' write(*,*)label,'' is present''', & ' else', & ' write(*,*)label,'' is not present''', & ' endif', & ' end subroutine tattle', & ' !', & ' subroutine not_optional(arg)', & ' integer,intent(in) :: arg', & ' write(*,*)''already tested X is defined'',arg', & ' end subroutine not_optional', & ' !', & ' end program demo_present', & '', & ' Results:', & '', & ' > optional argument x is not present', & ' > 0', & ' > optional argument x is present', & ' > already tested X is defined 1492', & ' > 2226064', & '', & 'STANDARD', & ' Fortran 95', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 present(3fortran)', & ''] shortname="present" call process() case('185','print') textblock=[character(len=256) :: & '', & 'print(7fortran) print(7fortran)', & '', & 'NAME', & ' print(7f) - [IO] write formatted sequential I/O to stdout', & '', & 'SYNOPSIS', & ' PRINT format [ , output-item-list ]', & '', & 'DESCRIPTION', & ' print(7f) is equivalent to', & '', & ' write(*,fmt=FORMAT_SPECIFIER) LIST', & '', & ' That is, it always writes formatted sequential I/O to stdout. It may use', & ' list-directed I/O or a FORMAT specifier.', & '', & ' print(7f) allows for no other options and therefore cannot be used for', & ' binary or non-advancing or stream or asynchronous I/O or any of the other', & ' options provided by the more general but also more complicated write(7f)', & ' statement.', & '', & ' Note that pure subprograms cannot contain I/O statements such as print(7f).', & '', & 'OPTIONS', & ' format', & ' a format may be used to specify how output items are displayed using the', & ' many Fortran format descriptors, or an asterisk (*) may be used to', & ' indicate to use list-directed default formatting.', & '', & ' output-item-list', & ' the variables whose values are to be displayed', & '', & 'EXAMPLE', & ' A simple example program:', & '', & ' program demo_print', & ' implicit none', & ' real :: a=11.11, s=sqrt(12.0)', & ' integer :: j=753210', & ' character(len=*),parameter :: commas=''(*(g0:,","))''', & '', & ' ! List-directed output is frequently specified', & ' PRINT *, A, S', & '', & ' ! a format may be placed on the print(7f) statement', & ' PRINT ''(*(g0,1x))'', A, S, J', & '', & ' ! the format may be in a character variable', & ' print commas, a, s, j', & '', & ' ! or may be in a labeled format statement', & ' PRINT 10, A, S, J', & ' 10 FORMAT (2E16.3,1x,I0)', & '', & ' end program demo_print', & '', & ' Results:', & '', & ' > 11.1099997 3.46410155', & ' > 11.1099997 3.46410155 753210', & ' > 11.1099997,3.46410155,753210', & ' > 0.111E+02 0.346E+01 753210', & '', & 'SEE ALSO', & ' o BACKSPACE(7)', & '', & ' o CLOSE(7)', & '', & ' o ENDFILE(7)', & '', & ' o FLUSH(7)', & '', & ' o INQUIRE(7)', & '', & ' o OPEN(7)', & '', & ' o PRINT(7)', & '', & ' o READ(7)', & '', & ' o REWIND(7)', & '', & ' o WAIT(7)', & '', & ' o WRITE(7)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 print(7fortran)', & ''] shortname="print" call process() case('186','product') textblock=[character(len=256) :: & '', & 'product(3fortran) product(3fortran)', & '', & 'NAME', & ' PRODUCT(3) - [ARRAY:REDUCTION] Product of array elements', & '', & 'SYNOPSIS', & ' result = product(array [,dim] [,mask])', & '', & ' NUMERIC function product(array, dim, mask)', & '', & ' NUMERIC,intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o NUMERIC is any numeric type and kind.', & '', & 'DESCRIPTION', & ' PRODUCT(3) multiplies together all the selected elements of ARRAY, or along', & ' dimension DIM if the corresponding element in MASK is .true..', & '', & ' If DIM is absent, a scalar with the product of all elements in ARRAY is', & ' returned. (Note a zero-sized ARRAY returns 1).', & '', & ' When DIM is present, If the masked array has a dimension of one (ie. is a', & ' vector) the result is a scalar. Otherwise, an array of rank N-1, where N', & ' equals the rank of ARRAY, and a shape similar to that of ARRAY with', & ' dimension DIM dropped is returned.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an array of type integer, real or complex.', & '', & ' o DIM : shall be a scalar of type integer with a value in the range from 1', & ' TO N, where N equals the rank of ARRAY.', & '', & ' o MASK : shall be of type logical and either be a scalar or an array of the', & ' same shape as ARRAY.', & '', & 'RESULT', & ' The result is of the same type as ARRAY.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_product', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0,1x))'' ! a handy format', & ' character(len=1),parameter :: nl=new_line(''a'')', & '', & ' NO_DIM: block', & ' ! If DIM is not specified, the result is the product of all the', & ' ! selected array elements.', & ' integer :: i,n, p1, p2', & ' integer,allocatable :: array(:)', & ' ! all elements are selected by default', & ' do n=1,10', & ' print all, ''factorial of '',n,'' is '', product([(real(i),i=1,n)])', & ' enddo', & '', & ' ! using a mask', & ' array=[10,12,13,15,20,25,30]', & ' p1=product(array, mask=mod(array, 2)==1) ! only odd elements', & ' p2=product(array, mask=mod(array, 2)/=1) ! only even elements', & ' print all, nl,''product of all elements'',product(array) ! all elements', & ' print all, '' odd * even ='',nl,p1,''*'',p2,''='',p1*p2', & '', & ' ! NOTE: If ARRAY is a zero-sized array, the result is equal to one', & ' print all', & ' print all, ''zero-sized array=>'',product([integer :: ])', & ' ! NOTE: If nothing in the mask is true, this also results in a null', & ' ! array', & ' print all, ''all elements have a false mask=>'', &', & ' & product(array,mask=.false.)', & '', & ' endblock NO_DIM', & '', & ' WITH_DIM: block', & ' integer :: rect(2,3)', & ' integer :: box(2,3,4)', & '', & ' ! lets fill a few arrays', & ' rect = reshape([ &', & ' 1, 2, 3, &', & ' 4, 5, 6 &', & ' ],shape(rect),order=[2,1])', & ' call print_matrix_int(''rect'',rect)', & '', & ' ! Find the product of each column in RECT.', & ' print all, ''product of columns='',product(rect, dim = 1)', & '', & ' ! Find the product of each row in RECT.', & ' print all, ''product of rows='',product(rect, dim = 2)', & '', & ' ! now lets try a box', & ' box(:,:,1)=rect', & ' box(:,:,2)=rect*(+10)', & ' box(:,:,3)=rect*(-10)', & ' box(:,:,4)=rect*2', & ' ! lets look at the values', & ' call print_matrix_int(''box 1'',box(:,:,1))', & ' call print_matrix_int(''box 2'',box(:,:,2))', & ' call print_matrix_int(''box 3'',box(:,:,3))', & ' call print_matrix_int(''box 4'',box(:,:,4))', & '', & ' ! remember without dim= even a box produces a scalar', & ' print all, ''no dim gives a scalar'',product(real(box))', & '', & ' ! only one plane has negative values, so note all the "1" values', & ' ! for vectors with no elements', & ' call print_matrix_int(''negative values'', &', & ' & product(box,mask=box < 0,dim=1))', & '', & ' ! If DIM is specified and ARRAY has rank greater than one, the', & ' ! result is a new array in which dimension DIM has been eliminated.', & '', & ' ! pick a dimension to multiply though', & ' call print_matrix_int(''dim=1'',product(box,dim=1))', & '', & ' call print_matrix_int(''dim=2'',product(box,dim=2))', & '', & ' call print_matrix_int(''dim=3'',product(box,dim=3))', & '', & ' endblock WITH_DIM', & '', & ' contains', & '', & ' subroutine print_matrix_int(title,arr)', & ' implicit none', & '', & ' !@(#) print small 2d integer arrays in row-column format', & '', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: arr(:,:)', & ' integer :: i', & ' character(len=:),allocatable :: biggest', & '', & ' print all', & ' print all, trim(title),'':('',shape(arr),'')'' ! print title', & ' biggest='' '' ! make buffer to write integer into', & ' ! find how many characters to use for integers', & ' write(biggest,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(arr))))))+2', & ' ! use this format to write a row', & ' biggest=''(" > [",*(i''//trim(biggest)//'':,","))''', & ' ! print one row of array at a time', & ' do i=1,size(arr,dim=1)', & ' write(*,fmt=biggest,advance=''no'')arr(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & '', & ' end subroutine print_matrix_int', & '', & ' end program demo_product', & '', & ' Results:', & '', & ' > factorial of 1 is 1.00000000', & ' > factorial of 2 is 2.00000000', & ' > factorial of 3 is 6.00000000', & ' > factorial of 4 is 24.0000000', & ' > factorial of 5 is 120.000000', & ' > factorial of 6 is 720.000000', & ' > factorial of 7 is 5040.00000', & ' > factorial of 8 is 40320.0000', & ' > factorial of 9 is 362880.000', & ' > factorial of 10 is 3628800.00', & ' >', & ' > product of all elements 351000000', & ' > odd * even =', & ' > 4875 * 72000 = 351000000', & ' >', & ' > zero-sized array=> 1', & ' > all elements have a false mask=> 1', & ' >', & ' > rect :( 2 3 )', & ' > > [ 1, 2, 3 ]', & ' > > [ 4, 5, 6 ]', & ' > product of columns= 4 10 18', & ' > product of rows= 6 120', & ' >', & ' > box 1 :( 2 3 )', & ' > > [ 1, 2, 3 ]', & ' > > [ 4, 5, 6 ]', & ' >', & ' > box 2 :( 2 3 )', & ' > > [ 10, 20, 30 ]', & ' > > [ 40, 50, 60 ]', & ' >', & ' > box 3 :( 2 3 )', & ' > > [ -10, -20, -30 ]', & ' > > [ -40, -50, -60 ]', & ' >', & ' > box 4 :( 2 3 )', & ' > > [ 2, 4, 6 ]', & ' > > [ 8, 10, 12 ]', & ' > no dim gives a scalar 0.171992703E+26', & ' >', & ' > negative values :( 3 4 )', & ' > > [ 1, 1, 400, 1 ]', & ' > > [ 1, 1, 1000, 1 ]', & ' > > [ 1, 1, 1800, 1 ]', & ' >', & ' > dim=1 :( 3 4 )', & ' > > [ 4, 400, 400, 16 ]', & ' > > [ 10, 1000, 1000, 40 ]', & ' > > [ 18, 1800, 1800, 72 ]', & ' >', & ' > dim=2 :( 2 4 )', & ' > > [ 6, 6000, -6000, 48 ]', & ' > > [ 120, 120000, -120000, 960 ]', & ' >', & ' > dim=3 :( 2 3 )', & ' > > [ -200, -3200, -16200 ]', & ' > > [ -51200, -125000, -259200 ]', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' SUM(3), note that an element by element multiplication is done directly', & ' using the star character.', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 product(3fortran)', & ''] shortname="product" call process() case('187','program') textblock=[character(len=256) :: & '', & 'program(7fortran) program(7fortran)', & '', & 'NAME', & ' PROGRAM(3) - [PROGRAM UNITS] Absolute value', & '', & 'SYNOPSIS', & ' Basic Fortran program sections:', & '', & ' [ PROGRAM [program-name]]', & '', & ' [ specification-part ]', & ' [ execution-part ]', & ' [ internal-subprogram-part ]', & '', & ' end [PROGRAM [program-name]]', & '', & ' A PROGRAM directive optionally marks the beginning of a main program.', & '', & ' A main program is the starting point for execution of a program.', & '', & ' The main program may be defined by means other than Fortran; in that case,', & ' the program shall not contain a Fortran main-program program unit at all.', & '', & ' The optional name of the main program has no explicit use within the Fortran', & ' language. It is available for documentation and for possible use by a', & ' processor.', & '', & ' A processor might implement an unnamed program unit by assigning it a global', & ' identifier that is not used elsewhere in the program. This could be done by', & ' using a default name that does not satisfy the rules for Fortran names, but', & ' if the name is specified it must conform to the rules for a Fortran', & ' identifier (composed from the ASCII alphanumeric characters and underscore,', & ' up to 63 characters, must begin with a letter).', & '', & ' The PROGRAM statement is optional but is almost always present in modern', & ' programs. Since it is optional a Fortran main program block is defined as a', & ' program unit that does not contain a SUBROUTINE, FUNCTION, MODULE,', & ' SUBMODULE,or BLOCKDATA statement as its first statement.', & '', & ' Note that the PROGRAM block is not required to be the first program unit in', & ' a file. Modules or procedure definitions or other program units may proceed', & ' it and most may follow it (A module must be defined before a reference to it', & ' is made).', & '', & ' The program-name shall not be included in the end-program-stmt unless the', & ' optional program-stmt is used. If included, it shall be identical to the', & ' program-name specified in the program-stmt.', & '', & ' NOTE1 The program name is global to the program.', & '', & ' An example of a main program is:', & '', & ' PROGRAM ANALYZE', & ' REAL A, B, C (10,10)', & ' ! Specification part', & '', & ' CALL FIND', & ' ! Execution part', & '', & ' CONTAINS', & ' SUBROUTINE FIND', & ' ! Internal subprogram . . .', & '', & ' END SUBROUTINE FIND', & ' END PROGRAM ANALYZE', & ' A reference to a Fortran main-program shall not appear in any program unit', & ' in the program, including itself. That is, you cannot call or jump to a main', & ' program from another program unit such as a module or procedure.', & '', & 'GLOSSARY', & ' program', & '', & ' set of Fortran program units and entities defined by means other than', & ' Fortran that includes exactly one main program.', & '', & ' program unit', & '', & ' A main program, external subprogram, module, submodule, or block data', & ' program unit.', & '', & ' March 16, 2025 program(7fortran)', & ''] shortname="program" call process() case('188','radix') textblock=[character(len=256) :: & '', & 'radix(3fortran) radix(3fortran)', & '', & 'NAME', & ' RADIX(3) - [MODEL:NUMERIC] Base of a numeric model', & '', & 'SYNOPSIS', & ' result = radix(x)', & '', & ' integer function radix(x)', & '', & ' TYPE(kind=**),intent(in) :: x(..)', & '', & 'CHARACTERISTICS', & ' o X may be scalar or an array of any real or integer type.', & '', & ' o the result is a default integer scalar.', & '', & 'DESCRIPTION', & ' RADIX(3) returns the base of the internal model representing the numeric', & ' entity X.', & '', & ' In a positional numeral system, the radix or base is the number of unique', & ' digits, including the digit zero, used to represent numbers.', & '', & ' This function helps to represent the internal computing model generically,', & ' but will be 2 (representing a binary machine) for any common platform for', & ' all the numeric types.', & '', & 'OPTIONS', & ' o X : used to identify the type of number to query.', & '', & 'RESULT', & ' The returned value indicates what base is internally used to represent the', & ' type of numeric value X represents.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_radix', & ' implicit none', & ' print *, "The radix for the default integer kind is", radix(0)', & ' print *, "The radix for the default real kind is", radix(0.0)', & ' print *, "The radix for the doubleprecision real kind is", radix(0.0d0)', & ' end program demo_radix', & '', & ' Results:', & '', & ' > The radix for the default integer kind is 2', & ' > The radix for the default real kind is 2', & ' > The radix for the doubleprecision real kind is 2', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RANGE(3), RRSPACING(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 radix(3fortran)', & ''] shortname="radix" call process() case('189','random_init') textblock=[character(len=256) :: & '', & 'random_init(3fortran) random_init(3fortran)', & '', & 'NAME', & ' RANDOM_INIT(3) - [MATHEMATICS:RANDOM] Initializes the state of the', & ' pseudorandom number generator', & '', & 'SYNOPSIS', & ' call random_init(repeatable, image_distinct)', & '', & ' logical,intent(in) :: repeatable', & ' logical,intent(in) :: image_distinct', & '', & 'CHARACTERISTICS', & ' o HARVEST and IMAGE_DISTINCT are logical scalars', & '', & ' Description', & '', & ' Initializes the state of the pseudorandom number generator used by', & ' RANDOM_NUMBER.', & '', & 'OPTIONS', & ' REPEATABLE : If it is .TRUE., the seed is set to a processor-dependent value', & ' that is the same each time RANDOM_INIT is called from the same image. The', & ' term "same image" means a single instance of program execution. The sequence', & ' of random numbers is different for repeated execution of the program.', & '', & ' If it is .FALSE., the seed is set to a processor-dependent value.', & '', & ' IMAGE_DISTINCT : If it is .true., the seed is set to a processor-dependent', & ' value that is distinct from the seed set by a call to RANDOM_INITin another', & ' image. If it is .FALSE., the seed is set to a value that does depend on', & ' which image called RANDOM_INIT.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_random_init', & ' implicit none', & ' real x(3), y(3)', & ' call random_init(.true., .true.)', & ' call random_number(x)', & ' call random_init(.true., .true.)', & ' call random_number(y)', & ' ! x and y should be the same sequence', & ' if ( any(x /= y) ) stop "x(:) and y(:) are not all equal"', & ' write(*,*)x', & ' write(*,*)y', & ' end program demo_random_init', & '', & ' Results:', & '', & ' RUN 1:', & '', & ' > 0.825262189 0.191325366 0.155503273', & ' > 0.825262189 0.191325366 0.155503273', & '', & ' RUN 2:', & '', & ' > 0.825262189 0.191325366 0.155503273', & ' > 0.825262189 0.191325366 0.155503273', & '', & 'STANDARD', & ' Fortran 2018', & '', & 'SEE ALSO', & ' random_number, random_seed', & '', & ' _Fortran intrinsic descriptions', & '', & ' March 16, 2025 random_init(3fortran)', & ''] shortname="random_init" call process() case('190','random_number') textblock=[character(len=256) :: & '', & 'random_number(3fortran) random_number(3fortran)', & '', & 'NAME', & ' RANDOM_NUMBER(3) - [MATHEMATICS:RANDOM] Pseudo-random number', & '', & 'SYNOPSIS', & ' call random_number(harvest)', & '', & ' subroutine random_number(harvest)', & '', & ' real,intent(out) :: harvest(..)', & '', & 'CHARACTERISTICS', & ' o HARVEST and the result are default real variables', & '', & 'DESCRIPTION', & ' RANDOM_NUMBER(3) returns a single pseudorandom number or an array of', & ' pseudorandom numbers from the uniform distribution over the range 0 <= x <', & ' 1.', & '', & 'OPTIONS', & ' o HARVEST : Shall be a scalar or an array of type real.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_random_number', & ' use, intrinsic :: iso_fortran_env, only : dp=>real64', & ' implicit none', & ' integer, allocatable :: seed(:)', & ' integer :: n', & ' integer :: first,last', & ' integer :: i', & ' integer :: rand_int', & ' integer,allocatable :: count(:)', & ' real(kind=dp) :: rand_val', & ' call random_seed(size = n)', & ' allocate(seed(n))', & ' call random_seed(get=seed)', & ' first=1', & ' last=10', & ' allocate(count(last-first+1))', & ' ! To have a discrete uniform distribution on the integers', & ' ! [first, first+1, ..., last-1, last] carve the continuous', & ' ! distribution up into last+1-first equal sized chunks,', & ' ! mapping each chunk to an integer.', & ' !', & ' ! One way is:', & ' ! call random_number(rand_val)', & ' ! choose one from last-first+1 integers', & ' ! rand_int = first + FLOOR((last+1-first)*rand_val)', & ' count=0', & ' ! generate a lot of random integers from 1 to 10 and count them.', & ' ! with a large number of values you should get about the same', & ' ! number of each value', & ' do i=1,100000000', & ' call random_number(rand_val)', & ' rand_int=first+floor((last+1-first)*rand_val)', & ' if(rand_int.ge.first.and.rand_int.le.last)then', & ' count(rand_int)=count(rand_int)+1', & ' else', & ' write(*,*)rand_int,'' is out of range''', & ' endif', & ' enddo', & ' write(*,''(i0,1x,i0)'')(i,count(i),i=1,size(count))', & ' end program demo_random_number', & '', & ' Results:', & '', & ' > 1 10003588', & ' > 2 10000104', & ' > 3 10000169', & ' > 4 9997996', & ' > 5 9995349', & ' > 6 10001304', & ' > 7 10001909', & ' > 8 9999133', & ' > 9 10000252', & ' > 10 10000196', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' RANDOM_SEED(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 random_number(3fortran)', & ''] shortname="random_number" call process() case('191','random_seed') textblock=[character(len=256) :: & '', & 'random_seed(3fortran) random_seed(3fortran)', & '', & 'NAME', & ' RANDOM_SEED(3) - [MATHEMATICS:RANDOM] Initialize a pseudo-random number', & ' sequence', & '', & 'SYNOPSIS', & ' call random_seed( [size] [,put] [,get] )', & '', & ' subroutine random_seed( size, put, get )', & '', & ' integer,intent(out),optional :: size', & ' integer,intent(in),optional :: put(*)', & ' integer,intent(out),optional :: get(*)', & '', & 'CHARACTERISTICS', & ' o SIZE a scalar default integer', & '', & ' o PUT a rank-one default integer array', & '', & ' o GET a rank-one default integer array', & '', & ' o the result', & '', & 'DESCRIPTION', & ' RANDOM_SEED(3) restarts or queries the state of the pseudorandom number', & ' generator used by random_number.', & '', & ' If random_seed is called without arguments, it is seeded with random data', & ' retrieved from the operating system.', & '', & 'OPTIONS', & ' o SIZE : specifies the minimum size of the arrays used with the PUT and GET', & ' arguments.', & '', & ' o PUT : the size of the array must be larger than or equal to the number', & ' returned by the SIZE argument.', & '', & ' o GET : It is INTENT(OUT) and the size of the array must be larger than or', & ' equal to the number returned by the SIZE argument.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_random_seed', & ' implicit none', & ' integer, allocatable :: seed(:)', & ' integer :: n', & '', & ' call random_seed(size = n)', & ' allocate(seed(n))', & ' call random_seed(get=seed)', & ' write (*, *) seed', & '', & ' end program demo_random_seed', & '', & ' Results:', & '', & ' > -674862499 -1750483360 -183136071 -317862567 682500039', & ' > 349459 344020729 -1725483289', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' RANDOM_NUMBER(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 random_seed(3fortran)', & ''] shortname="random_seed" call process() case('192','range') textblock=[character(len=256) :: & '', & 'range(3fortran) range(3fortran)', & '', & 'NAME', & ' RANGE(3) - [MODEL:NUMERIC] Decimal exponent range of a numeric kind', & '', & 'SYNOPSIS', & ' result = range(x)', & '', & ' integer function range (x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X may be of type integer, real, or complex. It may be a scalar or an', & ' array.', & '', & ' o KIND is any kind supported by the type of X', & '', & ' o the result is a default integer scalar', & '', & 'DESCRIPTION', & ' RANGE(3) returns the decimal exponent range in the model of the type of X.', & '', & ' Since X is only used to determine the type and kind being interrogated, the', & ' value need not be defined.', & '', & 'OPTIONS', & ' o X : the value whose type and kind are used for the query', & '', & 'RESULT', & ' Case (i) : For an integer argument, the result has the value', & '', & ' int (log10 (huge(x)))', & '', & ' Case (ii) : For a real argument, the result has the value', & '', & ' int(min (log10 (huge(x)), -log10(tiny(x) )))', & '', & ' Case (iii) : For a complex argument, the result has the value', & '', & ' range(real(x))', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_range', & ' use,intrinsic :: iso_fortran_env, only : dp=>real64,sp=>real32', & ' implicit none', & ' real(kind=sp) :: x(2)', & ' complex(kind=dp) :: y', & ' print *, precision(x), range(x)', & ' print *, precision(y), range(y)', & ' end program demo_range', & '', & ' Results:', & '', & ' > 6 37', & ' > 15 307', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RRSPACING(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 range(3fortran)', & ''] shortname="range" call process() case('193','rank') textblock=[character(len=256) :: & '', & 'rank(3fortran) rank(3fortran)', & '', & 'NAME', & ' RANK(3) - [ARRAY:INQUIRY] Rank of a data object', & '', & 'SYNOPSIS', & ' result = rank(a)', & '', & ' integer function rank(a)', & '', & ' type(TYPE(kind=**)),intent(in) :: a(..)', & '', & 'CHARACTERISTICS', & ' o A can be of any type TYPE and rank.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' RANK(3) returns the rank of a scalar or array data object.', & '', & ' The rank of an array is the number of dimensions it has (zero for a scalar).', & '', & 'OPTIONS', & ' o A : is the data object to query the dimensionality of. The rank returned', & ' may be from 0 to 16.', & '', & ' The argument A may be any data object type, including an assumed-rank', & ' array.', & '', & 'RESULT', & ' For arrays, their rank is returned; for scalars zero is returned.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_rank', & ' implicit none', & '', & ' ! a bunch of data objects to query', & ' integer :: a', & ' real, allocatable :: b(:,:)', & ' real, pointer :: c(:)', & ' complex :: d', & '', & ' ! make up a type', & ' type mytype', & ' integer :: int', & ' real :: float', & ' character :: char', & ' end type mytype', & ' type(mytype) :: any_thing(1,2,3,4,5)', & '', & ' ! basics', & ' print *, ''rank of scalar a='',rank(a)', & ' ! you can query this array even though it is not allocated', & ' print *, ''rank of matrix b='',rank(b)', & ' print *, ''rank of vector pointer c='',rank(c)', & ' print *, ''rank of complex scalar d='',rank(d)', & '', & ' ! you can query any type, not just intrinsics', & ' print *, ''rank of any arbitrary type='',rank(any_thing)', & '', & ' ! an assumed-rank object may be queried', & ' call query_int(10)', & ' call query_int([20,30])', & ' call query_int( reshape([40,50,60,70],[2,2]) )', & '', & ' ! you can even query an unlimited polymorphic entity', & ' call query_anything(10.0)', & ' call query_anything([.true.,.false.])', & ' call query_anything( reshape([40.0,50.0,60.0,70.0],[2,2]) )', & '', & ' contains', & '', & ' subroutine query_int(data_object)', & ' ! It is hard to do much with something dimensioned', & ' ! name(..) if not calling C except inside of a', & ' ! SELECT_RANK construct but one thing you can', & ' ! do is call the inquiry functions ...', & ' integer,intent(in) :: data_object(..)', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & '', & ' if(rank(data_object).eq.0)then', & ' print all,&', & ' & ''passed a scalar to an assumed rank, &', & ' & rank='',rank(data_object)', & ' else', & ' print all,&', & ' & ''passed an array to an assumed rank, &', & ' & rank='',rank(data_object)', & ' endif', & '', & ' end subroutine query_int', & '', & ' subroutine query_anything(data_object)', & ' class(*),intent(in) ::data_object(..)', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' if(rank(data_object).eq.0)then', & ' print all,&', & ' &''passed a scalar to an unlimited polymorphic rank='', &', & ' & rank(data_object)', & ' else', & ' print all,&', & ' & ''passed an array to an unlimited polymorphic, rank='', &', & ' & rank(data_object)', & ' endif', & ' end subroutine query_anything', & '', & ' end program demo_rank', & '', & ' Results:', & '', & ' > rank of scalar a= 0', & ' > rank of matrix b= 2', & ' > rank of vector pointer c= 1', & ' > rank of complex scalar d= 0', & ' > rank of any arbitrary type= 5', & ' > passed a scalar to an assumed rank, rank= 0', & ' > passed an array to an assumed rank, rank= 1', & ' > passed an array to an assumed rank, rank= 2', & ' > passed a scalar to an unlimited polymorphic rank= 0', & ' > passed an array to an unlimited polymorphic, rank= 1', & ' > passed an array to an unlimited polymorphic, rank= 2', & '', & 'STANDARD', & 'SEE ALSO', & ' Array inquiry:', & '', & ' o SIZE(3) - Determine the size of an array', & '', & ' o RANK(3) - Rank of a data object', & '', & ' o SHAPE(3) - Determine the shape of an array', & '', & ' o UBOUND(3) - Upper dimension bounds of an array', & '', & ' o LBOUND(3) - Lower dimension bounds of an array', & '', & ' State Inquiry:', & '', & ' o ALLOCATED(3) - Status of an allocatable entity', & '', & ' o IS_CONTIGUOUS(3) - Test if object is contiguous', & '', & ' Kind Inquiry:', & '', & ' o KIND(3) - Kind of an entity', & '', & ' Bit Inquiry:', & '', & ' o STORAGE_SIZE(3) - Storage size in bits', & '', & ' o BIT_SIZE(3) - Bit size inquiry function', & '', & ' o BTEST(3) - Tests a bit of an integer value.', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 rank(3fortran)', & ''] shortname="rank" call process() case('194','read') textblock=[character(len=256) :: & '', & 'read(7fortran) read(7fortran)', & '', & 'NAME', & ' read(7f) - [IO] read data', & '', & 'SYNOPSIS', & 'DESCRIPTION', & 'OPTIONS', & 'EXAMPLES', & ' Sample:', & '', & ' program testit', & ' use,intrinsic :: iso_fortran_env, only : stdin=>input_unit', & ' implicit none', & ' character(len=:),allocatable :: line', & ' character(len=*),parameter :: gen=''(*(g0))''', & ' integer :: ichars=0, ilines=0, ilength=0, ios', & ' open(unit=stdin,pad=''no'')', & ' READFILE: do', & ' call getl(line,ios)', & ' if(ios.ne.0)exit READFILE', & ' ilines=ilines+1', & ' ilength=len(line)', & ' ichars=ichars+ilength', & ' write(*,''(i9,i9,i9,"[",a,"]")'')ichars,ilines,ilength,line', & ' enddo READFILE', & ' write(*,gen)''CHARS+LINES='',ichars+ilines', & ' contains', & ' subroutine getl(line,ios)', & ' use,intrinsic :: iso_fortran_env, only : iostat_eor, iostat_end, &', & ' & stderr=>error_unit', & ' character(len=:),intent(out),allocatable :: line', & ' integer,intent(out) :: ios', & ' character :: a*1,msg*256', & ' line=''''', & ' READLINE: do', & ' read(stdin,advance=''no'',iostat=ios,fmt=''(a)'',iomsg=msg) a', & ' select case(ios)', & ' case(IOSTAT_END); exit READLINE', & ' case(IOSTAT_EOR); ios=0; exit READLINE', & ' case(0); line=line//a', & ' case default', & ' write(stderr,gen)''LINE '',ilines,'' ERROR:'',trim(msg)', & ' exit READLINE', & ' end select', & ' enddo READLINE', & ' end subroutine getl', & ' end program testit', & '', & 'SEE ALSO', & ' BACKSPACE(7), CLOSE(7), ENDFILE(7), FLUSH(7), INQUIRE(7), OPEN(7), PRINT(7),', & ' READ(7), REWIND(7), WAIT(7), WRITE(7)', & '', & ' March 16, 2025 read(7fortran)', & ''] shortname="read" call process() case('195','real') textblock=[character(len=256) :: & '', & 'real(3fortran) real(3fortran)', & '', & 'NAME', & ' REAL(3) - [TYPE:CONVERSION] Convert to real type', & '', & 'SYNOPSIS', & ' result = real(x [,kind])', & '', & ' elemental real(kind=KIND) function real(x,KIND)', & '', & ' TYPE(kind=**),intent(in) :: x', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o the type of X may be integer, real, or complex; or a BOZ-literal-', & ' constant.', & '', & ' o KIND is a integer initialization expression (a constant expression)', & '', & ' o If KIND is present it defines the kind of the real result', & '', & ' o if KIND is not present', & '', & ' o when X is complex the result is a real of the same kind as X.', & '', & ' o when X is real or integer the result is a real of default kind', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' REAL(3) converts its argument X to a real type.', & '', & ' The real part of a complex value is returned. For complex values this is', & ' similar to the modern complex-part-designator %RE which also designates the', & ' real part of a complex value.', & '', & ' z=(3.0,4.0) ! if z is a complex value', & ' print *, z%re == real(z) ! these expressions are equivalent', & '', & 'OPTIONS', & ' o X : An integer, real, or complex value to convert to real.', & '', & ' o KIND : When present the value of KIND defines the kind of the result.', & '', & 'RESULT', & ' 1. REAL(X) converts X to a default real type if X is an integer or real', & ' variable.', & '', & ' 2. REAL(X) converts a complex value to a real type with the magnitude of', & ' the real component of the input with kind type parameter the same as X.', & '', & ' 3. REAL(X, KIND) is converted to a real type with kind type parameter KIND', & ' if X is a complex, integer, or real variable.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_real', & ' use,intrinsic :: iso_fortran_env, only : dp=>real64', & ' implicit none', & ' complex :: zr = (1.0, 2.0)', & ' doubleprecision :: xd=huge(3.0d0)', & ' complex(kind=dp) :: zd=cmplx(4.0e0_dp,5.0e0_dp,kind=dp)', & '', & ' print *, real(zr), aimag(zr)', & ' print *, dble(zd), aimag(zd)', & '', & ' write(*,*)xd,real(xd,kind=kind(0.0d0)),dble(xd)', & ' end program demo_real', & '', & ' Results:', & '', & ' > 1.00000000 2.00000000', & ' > 4.0000000000000000 5.0000000000000000', & ' > 1.7976931348623157E+308 1.7976931348623157E+308 1.7976931348623157E+30', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' o AIMAG(3) - Imaginary part of complex number', & '', & ' o CMPLX(3) - Complex conversion function', & '', & ' o CONJG(3) - Complex conjugate function', & '', & ' Fortran has strong support for complex values, including many intrinsics', & ' that take or produce complex values in addition to algebraic and logical', & ' expressions:', & '', & ' ABS(3), ACOSH(3), ACOS(3), ASINH(3), ASIN(3), ATAN2(3), ATANH(3), ATAN(3),', & ' COSH(3), COS(3), CO_SUM(3), DBLE(3), DOT_PRODUCT(3), EXP(3), INT(3),', & ' IS_CONTIGUOUS(3), KIND(3), LOG(3), MATMUL(3), PRECISION(3), PRODUCT(3),', & ' RANGE(3), RANK(3), SINH(3), SIN(3), SQRT(3), STORAGE_SIZE(3), SUM(3),', & ' TANH(3), TAN(3), UNPACK(3),', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 real(3fortran)', & ''] shortname="real" call process() case('196','reduce') textblock=[character(len=256) :: & '', & 'reduce(3fortran) reduce(3fortran)', & '', & 'NAME', & ' REDUCE(3) - [ARRAY:TRANSFORMATIONAL] General reduction of an array', & '', & 'SYNOPSIS', & ' There are two forms to this function:', & '', & ' result = reduce(array, operation [,mask] [,identity] [,ordered] )', & '', & ' or', & '', & ' result = reduce (array, operation, dim &', & ' & [,mask] [,identity] [,ordered] )', & '', & ' type(TYPE(kind=KIND)) function reduce &', & ' & (array, operation, dim, mask, identity, ordered )', & '', & ' type(TYPE(kind=KIND)),intent(in) :: array', & ' pure function :: operation', & ' integer,intent(in),optional :: dim', & ' logical,optional :: mask', & ' type(TYPE),intent(in),optional :: identity', & ' logical,intent(in),optional :: ordered', & '', & 'CHARACTERISTICS', & ' o ARRAY is an array of any type', & '', & ' o OPERATION is a pure function with exactly two arguments', & '', & ' o each argument is scalar, non-allocatable, a nonpointer, nonpolymorphic', & ' and nonoptional with the same type and kind as array.', & '', & ' o if one argument has the asynchronous, target, or value attribute so', & ' shall the other.', & '', & ' o DIM is an integer scalar', & '', & ' o MASK is a logical conformable with ARRAY', & '', & ' o IDENTITY is a scalar with the same type and type parameters as ARRAY', & '', & ' o ORDERED is a logical scalar', & '', & ' o the result is of the same type and type parameters as ARRAY.', & '', & 'DESCRIPTION', & ' REDUCE(3) reduces a list of conditionally selected values from an array to a', & ' single value by iteratively applying a binary function.', & '', & ' Common in functional programming, a REDUCE function applies a binary', & ' operator (a pure function with two arguments) to all elements cumulatively.', & '', & ' REDUCE is a "higher-order" function; ie. it is a function that receives', & ' other functions as arguments.', & '', & ' The REDUCE function receives a binary operator (a function with two', & ' arguments, just like the basic arithmetic operators). It is first applied to', & ' two unused values in the list to generate an accumulator value which is', & ' subsequently used as the first argument to the function as the function is', & ' recursively applied to all the remaining selected values in the input array.', & '', & 'OPTIONS', & ' o ARRAY : An array of any type and allowed rank to select values from.', & '', & ' o OPERATION : shall be a pure function with exactly two arguments; each', & ' argument shall be a scalar, nonallocatable, nonpointer, nonpolymorphic,', & ' nonoptional dummy data object with the same type and type parameters as', & ' ARRAY. If one argument has the ASYNCHRONOUS, TARGET, or VALUE attribute,', & ' the other shall have that attribute. Its result shall be a nonpolymorphic', & ' scalar and have the same type and type parameters as ARRAY. OPERATION', & ' should implement a mathematically associative operation. It need not be', & ' commutative.', & '', & ' NOTE', & ' If OPERATION is not computationally associative, REDUCE without', & ' ORDERED=.TRUE. with the same argument values might not always produce the', & ' same result, as the processor can apply the associative law to the', & ' evaluation.', & '', & ' Many operations that mathematically are associative are not when applied to', & ' floating-point numbers. The order you sum values in may affect the result,', & ' for example.', & '', & ' o DIM : An integer scalar with a value in the range 1<= DIM <= n, where n', & ' is the rank of ARRAY.', & '', & ' o MASK : (optional) shall be of type logical and shall be conformable', & ' with ARRAY.', & '', & ' When present only those elements of ARRAY are passed to OPERATION for', & ' which the corresponding elements of MASK are true, as if ARRAY was', & ' filtered with PACK(3).', & '', & ' o IDENTITY : shall be scalar with the same type and type parameters as', & ' ARRAY. If the initial sequence is empty, the result has the value', & ' IDENTIFY if IDENTIFY is present, and otherwise, error termination is', & ' initiated.', & '', & ' o ORDERED : shall be a logical scalar. If ORDERED is present with the', & ' value .true., the calls to the OPERATOR function begins with the first', & ' two elements of ARRAY and the process continues in row-column order', & ' until the sequence has only one element which is the value of the', & ' reduction. Otherwise, the compiler is free to assume that the', & ' operation is commutative and may evaluate the reduction in the most', & ' optimal way.', & '', & 'RESULT', & ' The result is of the same type and type parameters as ARRAY. It is scalar if', & ' DIM does not appear.', & '', & ' If DIM is present, it indicates the one dimension along which to perform the', & ' reduction, and the resultant array has a rank reduced by one relative to the', & ' input array.', & '', & 'EXAMPLES', & ' The following examples all use the function MY_MULT, which returns the', & ' product of its two real arguments.', & '', & ' program demo_reduce', & ' implicit none', & ' character(len=*),parameter :: f=''("[",*(g0,",",1x),"]")''', & ' integer,allocatable :: arr(:), b(:,:)', & '', & ' ! Basic usage:', & ' ! the product of the elements of an array', & ' arr=[1, 2, 3, 4 ]', & ' write(*,*) arr', & ' write(*,*) ''product='', reduce(arr, my_mult)', & ' write(*,*) ''sum='', reduce(arr, my_sum)', & '', & ' ! Examples of masking:', & ' ! the product of only the positive elements of an array', & ' arr=[1, -1, 2, -2, 3, -3 ]', & ' write(*,*)''positive value product='',reduce(arr, my_mult, mask=arr>0)', & ' ! sum values ignoring negative values', & ' write(*,*)''sum positive values='',reduce(arr, my_sum, mask=arr>0)', & '', & ' ! a single-valued array returns the single value as the', & ' ! calls to the operator stop when only one element remains', & ' arr=[ 1234 ]', & ' write(*,*)''single value sum'',reduce(arr, my_sum )', & ' write(*,*)''single value product'',reduce(arr, my_mult )', & '', & ' ! Example of operations along a dimension:', & ' ! If B is the array 1 3 5', & ' ! 2 4 6', & ' b=reshape([1,2,3,4,5,6],[2,3])', & ' write(*,f) REDUCE(B, MY_MULT),''should be [720]''', & ' write(*,f) REDUCE(B, MY_MULT, DIM=1),''should be [2,12,30]''', & ' write(*,f) REDUCE(B, MY_MULT, DIM=2),''should be [15, 48]''', & '', & ' contains', & '', & ' pure function my_mult(a,b) result(c)', & ' integer,intent(in) :: a, b', & ' integer :: c', & ' c=a*b', & ' end function my_mult', & '', & ' pure function my_sum(a,b) result(c)', & ' integer,intent(in) :: a, b', & ' integer :: c', & ' c=a+b', & ' end function my_sum', & '', & ' end program demo_reduce', & '', & ' Results:', & '', & ' > 1 2 3 4', & ' > product= 24', & ' > sum= 10', & ' > positive value sum= 6', & ' > sum positive values= 6', & ' > single value sum 1234', & ' > single value product 1234', & ' > [720, should be [720],', & ' > [2, 12, 30, should be [2,12,30],', & ' > [15, 48, should be [15, 48],', & '', & 'STANDARD', & ' Fortran 2018', & '', & 'SEE ALSO', & ' o co_reduce(3)', & '', & 'RESOURCES', & ' o associative:wikipedia', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 reduce(3fortran)', & ''] shortname="reduce" call process() case('197','repeat') textblock=[character(len=256) :: & '', & 'repeat(3fortran) repeat(3fortran)', & '', & 'NAME', & ' REPEAT(3) - [CHARACTER:PAD] Repeated string concatenation', & '', & 'SYNOPSIS', & ' result = repeat(string, ncopies)', & '', & ' character(len=len(string)*ncopies) function repeat(string, ncopies)', & '', & ' character(len=*),intent(in) :: string', & ' integer(kind=**),intent(in) :: ncopies', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o STRING is a scalar character type.', & '', & ' o NCOPIES is a scalar integer.', & '', & ' o the result is a new scalar of type character of the same kind as the', & ' variable STRING.', & '', & 'DESCRIPTION', & ' REPEAT(3) concatenates copies of a string.', & '', & 'OPTIONS', & ' o STRING : The input string to repeat', & '', & ' o NCOPIES : Number of copies to make of STRING, greater than or equal to', & ' zero (0).', & '', & 'RESULT', & ' A new string built up from NCOPIES copies of STRING.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_repeat', & ' implicit none', & ' write(*,''(a)'') repeat("^v", 35) ! line break', & ' write(*,''(a)'') repeat("_", 70) ! line break', & ' write(*,''(a)'') repeat("1234567890", 7) ! number line', & ' write(*,''(a)'') repeat(" |", 7) !', & ' end program demo_repeat', & '', & ' Results:', & '', & ' > ^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v', & ' > ______________________________________________________________________', & ' > 1234567890123456789012345678901234567890123456789012345678901234567890', & ' > | | | | | | |', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' Functions that perform operations on character strings:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3), VERIFY(3)', & '', & ' o NON-ELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 repeat(3fortran)', & ''] shortname="repeat" call process() case('198','reshape') textblock=[character(len=256) :: & '', & 'reshape(3fortran) reshape(3fortran)', & '', & 'NAME', & ' RESHAPE(3) - [ARRAY:RESHAPE] Function to reshape an array', & '', & 'SYNOPSIS', & ' result = reshape( source, shape [,pad] [,order] )', & '', & ' type(TYPE(kind=KIND)) function reshape', & '', & ' type(TYPE(kind=KIND)),intent(in) :: source(..)', & ' integer(kind=**),intent(in) :: shape(:)', & ' type(TYPE(kind=KIND)),intent(in),optional :: pad(..)', & ' integer(kind=**),intent(in),optional :: order(:)', & '', & 'CHARACTERISTICS', & ' o SOURCE is an array of any type', & '', & ' o SHAPE defines a Fortran shape and therefore an integer vector (of rank', & ' one) of constant size of up to 16 non-negative values.', & '', & ' o PAD is the same type as SOURCE', & '', & ' o ORDER is the same shape as SHAPE', & '', & ' o The result is an array of shape SHAPE with the same type as SOURCE.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' RESHAPE constructs an array of arbitrary shape SHAPE using the elements from', & ' SOURCE and possibly PAD to fill it.', & '', & ' If necessary, the new array may be padded with elements from PAD or permuted', & ' as defined by ORDER.', & '', & ' Among many other uses, RESHAPE can be used to reorder a Fortran array to', & ' match C array ordering before the array is passed from Fortran to a C', & ' procedure.', & '', & 'OPTIONS', & ' o SOURCE : an array containing the elements to be copied to the result.', & ' there must be enough elements in the source to fill the new shape if PAD', & ' is omitted or has size zero. Expressed in Fortran ...', & '', & ' if(.not.present(pad))then', & ' if(size(source) < product(shape))then', & ' stop ''not enough elements in the old array to fill the new one''', & ' endif', & ' endif', & '', & ' o SHAPE : This is the shape of the new array being generated. Being by', & ' definition a shape; all elements are either positive integers or zero,', & ' the size but be 1 or greater, it may have up to 16 elements but must be', & ' of constant fixed size and rank one.', & '', & ' o PAD : used to fill in extra values if the result array is larger than', & ' SOURCE. It will be used repeatedly after all the elements of SOURCE have', & ' been placed in the result until the result has all elements assigned. :', & ' If it is absent or is a zero-sized array, you can only make SOURCE into', & ' another array of the same size as SOURCE or smaller.', & '', & ' o ORDER : used to insert elements in the result in an order other than the', & ' normal Fortran array element order, in which the first dimension varies', & ' fastest. : By definition of ranks the values have to be a permutation of', & ' the numbers from 1 to n, where n is the rank of SHAPE. : the elements of', & ' SOURCE and pad are placed into the result in order; changing the left-', & ' most rank most rapidly by default. To change the order by which the', & ' elements are placed in the result use ORDER.', & '', & 'RESULT', & ' The result is an array of shape SHAPE with the same type and type parameters', & ' as SOURCE. It is first filled with the values of elements of SOURCE, with', & ' the remainder filled with repeated copies of PAD until all elements are', & ' filled. The new array may be smaller than SOURCE.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_reshape', & ' implicit none', & ' ! notice the use of "shape(box)" on the RHS', & ' integer :: box(3,4)=reshape([1,2,3,4,5,6,7,8,9,10,11,12],shape(box))', & ' integer,allocatable :: v(:,:)', & ' integer :: rc(2)', & ' ! basics0', & ' ! what is the current shape of the array?', & ' call printi(''shape of box is '',box)', & ' ! change the shape', & ' call printi(''reshaped '',reshape(box,[2,6]))', & ' call printi(''reshaped '',reshape(box,[4,3]))', & '', & ' ! fill in row column order using order', & ' v=reshape([1,2,3,4,10,20,30,40,100,200,300,400],[1,12])', & ' call printi(''here is some data to shape'',v)', & ' call printi(''normally fills columns first '',reshape([v],[3,4]))', & ' call printi(''fill rows first'', reshape([v],[3,4],order=[2,1]))', & '', & ' ! if we take the data and put in back in filling', & ' ! rows first instead of columns, and flipping the', & ' ! height and width of the box we not only fill in', & ' ! a vector using row-column order we actually', & ' ! transpose it.', & ' rc(2:1:-1)=shape(box)', & ' ! copy the data in changing column number fastest', & ' v=reshape(box,rc,order=[2,1])', & ' call printi(''reshaped and reordered'',v)', & ' ! of course we could have just done a transpose', & ' call printi(''transposed'',transpose(box))', & '', & ' ! making the result bigger than source using pad', & ' v=reshape(box,rc*2,pad=[-1,-2,-3],order=[2,1])', & ' call printi(''bigger and padded and reordered'',v)', & ' contains', & '', & ' subroutine printi(title,arr)', & ' implicit none', & '', & ' !@(#) print small 2d integer arrays in row-column format', & '', & ' character(len=*),parameter :: all=''(*(g0,1x))'' ! a handy format', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: arr(:,:)', & ' integer :: i', & ' character(len=:),allocatable :: biggest', & '', & ' print all', & ' print all, trim(title),'':('',shape(arr),'')'' ! print title', & ' biggest='' '' ! make buffer to write integer into', & ' ! find how many characters to use for integers', & ' write(biggest,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(arr))))))+2', & ' ! use this format to write a row', & ' biggest=''(" > [",*(i''//trim(biggest)//'':,","))''', & ' ! print one row of array at a time', & ' do i=1,size(arr,dim=1)', & ' write(*,fmt=biggest,advance=''no'')arr(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & '', & ' end subroutine printi', & '', & ' end program demo_reshape', & '', & ' Results:', & '', & ' shape of box is :( 3 4 )', & ' > [ 1, 4, 7, 10 ]', & ' > [ 2, 5, 8, 11 ]', & ' > [ 3, 6, 9, 12 ]', & '', & ' reshaped :( 2 6 )', & ' > [ 1, 3, 5, 7, 9, 11 ]', & ' > [ 2, 4, 6, 8, 10, 12 ]', & '', & ' reshaped :( 4 3 )', & ' > [ 1, 5, 9 ]', & ' > [ 2, 6, 10 ]', & ' > [ 3, 7, 11 ]', & ' > [ 4, 8, 12 ]', & '', & ' here is some data to shape :( 1 12 )', & ' > [ 1, 2, 3, 4, 10, 20, 30, 40, 100, 200, 300, 400 ]', & '', & ' normally fills columns first :( 3 4 )', & ' > [ 1, 4, 30, 200 ]', & ' > [ 2, 10, 40, 300 ]', & ' > [ 3, 20, 100, 400 ]', & '', & ' fill rows first :( 3 4 )', & ' > [ 1, 2, 3, 4 ]', & ' > [ 10, 20, 30, 40 ]', & ' > [ 100, 200, 300, 400 ]', & '', & ' reshaped and reordered :( 4 3 )', & ' > [ 1, 2, 3 ]', & ' > [ 4, 5, 6 ]', & ' > [ 7, 8, 9 ]', & ' > [ 10, 11, 12 ]', & '', & ' transposed :( 4 3 )', & ' > [ 1, 2, 3 ]', & ' > [ 4, 5, 6 ]', & ' > [ 7, 8, 9 ]', & ' > [ 10, 11, 12 ]', & '', & ' bigger and padded and reordered :( 8 6 )', & ' > [ 1, 2, 3, 4, 5, 6 ]', & ' > [ 7, 8, 9, 10, 11, 12 ]', & ' > [ -1, -2, -3, -1, -2, -3 ]', & ' > [ -1, -2, -3, -1, -2, -3 ]', & ' > [ -1, -2, -3, -1, -2, -3 ]', & ' > [ -1, -2, -3, -1, -2, -3 ]', & ' > [ -1, -2, -3, -1, -2, -3 ]', & ' > [ -1, -2, -3, -1, -2, -3 ]', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' SHAPE(3), PACK(3), TRANSPOSE(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 reshape(3fortran)', & ''] shortname="reshape" call process() case('199','return') textblock=[character(len=256) :: & '', & 'return(7fortran) return(7fortran)', & '', & 'NAME', & ' return(7f) - [STATEMENT] completes execution of the instance of the', & ' subprogram in which it appears', & '', & 'SYNOPSIS', & ' RETURN [scalar-int-expr]', & '', & 'DESCRIPTION', & ' Execution of the RETURN statement completes execution of the instance of the', & ' subprogram in which it appears.', & '', & ' It is generally considered good practice to avoid having multiple RETURN', & ' statements in a single subprogram. A RETURN is not required in a subprogram', & ' as reaching the end of the subprogram is equivalent to execution of a RETURN', & ' statement with no expression.', & '', & ' The RETURN statement must appear in the scoping unit of a function or', & ' subroutine subprogram.', & '', & 'OPTIONS', & ' scalar-int-expr Alternate returns are deprecated!', & '', & ' If the expression appears and has a value n between', & ' 1 and the number of asterisks in the dummy argument', & ' list, the CALL statement that invoked the subroutine', & ' transfers control to the statement identified by', & ' the nth alternate return specifier in the actual', & ' argument list of the referenced procedure. If the', & ' expression is omitted or has a value outside the', & ' required range, there is no transfer of control to', & ' an alternate return.', & '', & ' The scalar-int-expr is allowed only in the scoping', & ' unit of a subroutine subprogram.', & '', & 'EXAMPLE', & ' Sample program', & '', & ' program demo_return', & ' call tryreturn(1)', & ' write(*,*)''back at main program:1''', & ' call tryreturn(10)', & ' write(*,*)''back at main program:10''', & ' contains', & ' subroutine tryreturn(i)', & ' integer,intent(in) :: i', & ' select case(i)', & ' case(1)', & ' write(*,*)''*one*''', & ' return', & ' case(2)', & ' write(*,*)''*two*''', & ' return', & ' case default', & ' write(*,*)''*unexpected value*''', & ' end select', & ' write(*,*)''*<ERROR> should not get here*''', & ' end subroutine tryreturn', & ' end program demo_return', & '', & ' Results:', & '', & ' > *one*', & ' > back at main program:1', & ' > *unexpected value*', & ' > *<ERROR> should not get here*', & ' > back at main program:10', & '', & ' Sample program using alternate returns. Alternate returns are an obsolescent', & ' feature.', & '', & ' program alt_return', & ' implicit none', & ' call one(2,*10,*20,*30)', & ' write(*,*)''did not select alternate return''', & ' goto 999', & ' 10 continue', & ' write(*,*)''picked first alternate return''', & ' goto 999', & ' 20 continue', & ' write(*,*)''picked second alternate return''', & ' goto 999', & ' 30 continue', & ' write(*,*)''picked third alternate return''', & ' goto 999', & ' 999 continue', & ' contains', & ' subroutine one(ipick,*,*,*)', & ' implicit none', & ' integer :: ipick', & ' select case(ipick)', & ' case(1)', & ' write(*,*)''first alternate return selected''', & ' return 1', & ' case(2)', & ' write(*,*)''second alternate return selected''', & ' return 2', & ' case(3)', & ' write(*,*)''third alternate return selected''', & ' return 3', & ' end select', & ' write(*,*)''no alternate return selected''', & ' end subroutine one', & ' end program alt_return', & '', & ' Results:', & '', & ' > second alternate return selected', & ' > picked second alternate return', & '', & ' Fortran statement descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 return(7fortran)', & ''] shortname="return" call process() case('200','rewind') textblock=[character(len=256) :: & '', & 'rewind(7fortran) rewind(7fortran)', & '', & 'NAME', & ' rewind(7f) - [FILE_POSITIONING] rewind specified sequential access I/O unit', & '', & 'SYNOPSIS', & ' rewind file-unit-number', & '', & ' rewind ( [UNIT=]file-unit-number][,IOMSG=iomsg-variable] & &', & ' [,IOSTAT=scalar-int-variable][,ERR=label] )', & '', & 'DESCRIPTION', & ' Execution of a REWIND(7F) statement causes the file connected to the', & ' specified unit to be positioned at the beginning of the file.', & '', & ' If the file is already positioned at its initial point, execution of this', & ' statement has no effect on the position of the file.', & '', & ' Execution of a REWIND(7F) statement for a file that is connected but does', & ' not exist is permitted and has no effect on any file.', & '', & 'OPTIONS', & ' UNIT : unit number of file to rewind. A unit open for direct access or', & ' stream access cannot be referenced by a REWIND(7F) (e.g. you cannot', & ' typically rewind stdin and stdout).', & '', & ' IOSTAT : (Optional) a compiler-specific number that indicates an error', & ' occurred if non-zero. If not present and an error occurs the program', & ' terminates.', & '', & ' IOMSG : (Optional) a message describing the error if IOSTAT is not zero.', & '', & ' ERR : (Optional) a label number to jump to if an error occurs', & '', & 'EXAMPLES', & ' An example of a REWIND(7F) statement is:', & '', & ' program demo_rewind', & ' implicit none', & ' character(len=256) :: line', & ' character(len=256) :: mssge', & ' integer :: i', & ' integer :: ios', & ' open (10, file=''demo_rewind.txt'') ! open a file', & ' do i = 1, 100 ! write lines to it', & ' write (10, ''(a,i0)'') ''line '', i', & ' enddo', & ' rewind (10, iostat=ios, iomsg=mssge)', & ' if (ios .ne. 0) then', & ' write (*, *) ''*error* '', trim(mssge)', & ' stop', & ' endif', & ' write (*, *) ''wrote 100 lines, but now at line ...''', & ' read (10, ''(a)'') line', & ' write (*, ''(a)'') line', & ' read (10)', & ' read (10)', & ' read (10)', & ' write (*, *) ''skipped a few lines, now at ...''', & ' read (10, ''(a)'') line', & ' write (*, ''(a)'') line', & ' close (10, status=''delete'')', & ' end program demo_rewind', & '', & 'SEE ALSO', & ' The input/output statements are the OPEN(3), CLOSE(3), READ(3), WRITE(3),', & ' PRINT(3), BACKSPACE(3), ENDFILE(3), REWIND(3), FLUSH(3), WAIT(3) and', & ' INQUIRE(3) statements.', & '', & ' o The READ(3) statement is a data transfer input statement.', & '', & ' o The WRITE(3) statement and the PRINT(3) statement are data transfer', & ' output statements.', & '', & ' o The WAIT(3) and FLUSH(3) statements are data transfer statements.', & '', & ' o The OPEN(3) statement and the CLOSE(3) statement are file connection', & ' statements.', & '', & ' o The INQUIRE(3) statement is a file inquiry statement.', & '', & ' o The BACKSPACE(3), ENDFILE(3), and REWIND(3) statements are file', & ' positioning statements.', & '', & ' Fortran statement descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 rewind(7fortran)', & ''] shortname="rewind" call process() case('201','rrspacing') textblock=[character(len=256) :: & '', & 'rrspacing(3fortran) rrspacing(3fortran)', & '', & 'NAME', & ' RRSPACING(3) - [MODEL_COMPONENTS] Reciprocal of the relative spacing of a', & ' numeric type', & '', & 'SYNOPSIS', & ' result = rrspacing(x)', & '', & ' elemental real(kind=KIND) function rrspacing(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is type real of any kind', & '', & ' o The return value is of the same type and kind as X.', & '', & 'DESCRIPTION', & ' RRSPACING(3) returns the reciprocal of the relative spacing of model numbers', & ' near X.', & '', & 'OPTIONS', & ' o X : Shall be of type real.', & '', & 'RESULT', & ' The return value is of the same type and kind as X. The value returned is', & ' equal to ABS(FRACTION(X)) * FLOAT(RADIX(X))**DIGITS(X).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_rrspacing', & ' implicit none', & ' integer, parameter :: sgl = selected_real_kind(p=6, r=37)', & ' integer, parameter :: dbl = selected_real_kind(p=13, r=200)', & ' character(len=*),parameter :: gen=''(*(g0))'', nl=new_line(''A'')', & ' real(kind=sgl) :: x', & ' x=-3.0_sgl', & ' print gen, &', & ' ''rrspacing('',x,''_sgl)='', rrspacing(x), nl, &', & ' ''rrspacing(x)=abs(fraction(x))*float(radix(x))**digits(x)'', nl, &', & ' ''so this should be the same as rrspacing():'', nl, &', & ' abs( fraction(x) ) * float( radix(x) )**digits(x), nl, &', & ' ''RRSPACING (-3.0) has the value 0.75x2**24 for reals'', nl, &', & ' ''on current typical platforms. For reference:'', nl, &', & ' '' 0.75*2**24='', 0.75*2**24, nl, &', & ' ''sign should not matter, so'',rrspacing(x)==rrspacing(-x), nl, &', & ' ''note the kind of the value is significant'', nl, &', & ' rrspacing(-3.0_dbl), nl, &', & ' ''for common platforms rrspacing(487923.3d0)=>'', nl, &', & ' '' 8.382458680573952E+015'', nl, &', & ' rrspacing(487923.3d0), nl, &', & ' '' ''', & ' end program demo_rrspacing', & '', & ' > rrspacing(-3.00000000_sgl)=12582912.0', & ' > rrspacing(x)=abs(fraction(x))*float(radix(x))**digits(x)', & ' > so this should be the same as rrspacing():', & ' > 12582912.0', & ' > RRSPACING (-3.0) has the value 0.75x2**24 for reals', & ' > on current typical platforms. For reference:', & ' > 0.75*2**24=12582912.0', & ' > sign should not matter, soT', & ' > note the kind of the value is significant', & ' > 6755399441055744.0', & ' > for common platforms rrspacing(487923.3d0)=>8.382458680573952E+015', & ' > 8382458465825587.0', & '', & 'STANDARD', & ' Fortran 90', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), SCALE(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 rrspacing(3fortran)', & ''] shortname="rrspacing" call process() case('202','same_type_as') textblock=[character(len=256) :: & '', & 'same_type_as(3fortran) same_type_as(3fortran)', & '', & 'NAME', & ' SAME_TYPE_AS(3) - [STATE:INQUIRY] Query dynamic types for equality', & '', & 'SYNOPSIS', & ' result = same_type_as(a, b)', & '', & ' logical same_type_as(a, b)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: a', & ' type(TYPE(kind=KIND)),intent(in) :: b', & '', & 'CHARACTERISTICS', & ' o A shall be an object of extensible declared type or unlimited', & ' polymorphic. If it is a polymorphic pointer, it shall not have an', & ' undefined association status.', & '', & ' o B shall be an object of extensible declared type or unlimited', & ' polymorphic. If it is a polymorphic pointer, it shall not have an', & ' undefined association status.', & '', & 'DESCRIPTION', & ' SAME_TYPE_AS(3) queries the dynamic types of objects for equality.', & '', & 'OPTIONS', & ' o A : object to compare to B for equality of type', & '', & ' o B : object to be compared to for equality of type', & '', & 'RESULT', & ' If the dynamic type of A or B is extensible, the result is true if and only', & ' if the dynamic type of A is the same as the dynamic type of B. If neither A', & ' nor B has extensible dynamic type, the result is processor dependent.', & '', & ' NOTE1', & '', & ' The dynamic type of a disassociated pointer or unallocated allocatable', & ' variable is its declared type. An unlimited polymorphic entity has no', & ' declared type.', & '', & ' NOTE2', & '', & ' The test performed by SAME_TYPE_AS is not the same as the test performed by', & ' the type guard TYPE IS. The test performed by SAME_TYPE_AS does not consider', & ' kind type parameters.', & '', & ' Sample program:', & '', & ' ! program demo_same_type_as', & ' module M_ether', & ' implicit none', & ' private', & '', & ' type :: dot', & ' real :: x=0', & ' real :: y=0', & ' end type dot', & '', & ' type, extends(dot) :: point', & ' real :: z=0', & ' end type point', & '', & ' type something_else', & ' end type something_else', & '', & ' public :: dot', & ' public :: point', & ' public :: something_else', & '', & ' end module M_ether', & '', & ' program demo_same_type_as', & ' use M_ether, only : dot, point, something_else', & ' implicit none', & ' type(dot) :: dad, mom', & ' type(point) :: me', & ' type(something_else) :: alien', & '', & ' write(*,*)same_type_as(me,dad),''I am descended from Dad, but equal?''', & ' write(*,*)same_type_as(me,me) ,''I am what I am''', & ' write(*,*)same_type_as(dad,mom) ,''what a pair!''', & '', & ' write(*,*)same_type_as(dad,me),''no paradox here''', & ' write(*,*)same_type_as(dad,alien),''no relation''', & '', & ' call pointers()', & ' contains', & ' subroutine pointers()', & ' ! Given the declarations and assignments', & ' type t1', & ' real c', & ' end type', & ' type, extends(t1) :: t2', & ' end type', & ' class(t1), pointer :: p, q, r', & ' allocate (p, q)', & ' allocate (t2 :: r)', & ' ! the result of SAME_TYPE_AS (P, Q) will be true, and the result', & ' ! of SAME_TYPE_AS (P, R) will be false.', & ' write(*,*)''(P,Q)'',same_type_as(p,q),"mind your P''s and Q''s"', & ' write(*,*)''(P,R)'',same_type_as(p,r)', & ' end subroutine pointers', & '', & ' end program demo_same_type_as', & '', & ' Results:', & '', & ' > F I am descended from Dad, but equal?', & ' > T I am what I am', & ' > T what a pair!', & ' > F no paradox here', & ' > F no relation', & ' > (P,Q) T mind your P''s and Q''s', & ' > (P,R) F', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' EXTENDS_TYPE_OF(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 same_type_as(3fortran)', & ''] shortname="same_type_as" call process() case('203','scale') textblock=[character(len=256) :: & '', & 'scale(3fortran) scale(3fortran)', & '', & 'NAME', & ' SCALE(3) - [MODEL:COMPONENTS] Scale a real value by a whole power of the', & ' radix', & '', & 'SYNOPSIS', & ' result = scale(x, i)', & '', & ' elemental real(kind=KIND) function scale(x, i)', & '', & ' real(kind=KIND),intent(in) :: x', & ' integer(kind=**),intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o X is type real of any kind', & '', & ' o I is type an integer of any kind', & '', & ' o the result is real of the same kind as X', & '', & 'DESCRIPTION', & ' SCALE(3) returns x * RADIX(X)**I.', & '', & ' It is almost certain the radix(base) of the platform is two, therefore', & ' SCALE(3) is generally the same as X*2**I', & '', & 'OPTIONS', & ' o X : the value to multiply by RADIX(X)**I. Its type and kind is used to', & ' determine the radix for values with its characteristics and determines', & ' the characteristics of the result, so care must be taken the returned', & ' value is within the range of the characteristics of X.', & '', & ' o I : The power to raise the radix of the machine to', & '', & 'RESULT', & ' The return value is X * RADIX(X)**I, assuming that value can be represented', & ' by a value of the type and kind of X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_scale', & ' implicit none', & ' real :: x', & ' complex :: c', & ' integer :: i', & ' x = 1.0', & ' print *, (scale(x,i),i=1,5)', & ' x = 3.0', & ' print *, (scale(x,i),i=1,5)', & ' print *, (scale(log(1.0),i),i=1,5)', & ' ! on modern machines radix(x) is almost certainly 2', & ' x = 178.1387e-4', & ' i = 5', & ' print *, x, i, scale(x, i), x*radix(x)**i', & ' ! x*radix(x)**i is the same except roundoff errors are not restricted', & ' i = 2', & ' print *, x, i, scale(x, i), x*radix(x)**i', & ' ! relatively easy to do complex values as well', & ' c=(3.0,4.0)', & ' print *, c, i, scale_complex(c, i)!, c*radix(c)**i', & ' contains', & ' function scale_complex(x, n)', & ' ! example supporting complex value for default kinds', & ' complex, intent(in) :: x', & ' integer, intent(in) :: n', & ' complex :: scale_complex', & ' scale_complex=cmplx(scale(x%re, n), scale(x%im, n), kind=kind(x%im))', & ' end function scale_complex', & ' end program demo_scale', & '', & ' Results:', & '', & ' > 2.00000000 4.00000000 8.00000000 16.0000000 32.0000000', & ' > 6.00000000 12.0000000 24.0000000 48.0000000 96.0000000', & ' > 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000', & ' > 1.78138707E-02 5 0.570043862 0.570043862', & ' > 1.78138707E-02 2 7.12554827E-02 7.12554827E-02', & ' > (3.00000000,4.00000000) 2 (12.0000000,16.0000000)', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3),', & ' SET_EXPONENT(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 scale(3fortran)', & ''] shortname="scale" call process() case('204','scan') textblock=[character(len=256) :: & '', & 'scan(3fortran) scan(3fortran)', & '', & 'NAME', & ' SCAN(3) - [CHARACTER:SEARCH] Scan a string for the presence of a set of', & ' characters', & '', & 'SYNOPSIS', & ' result = scan( string, set, [,back] [,kind] )', & '', & ' elemental integer(kind=KIND) function scan(string,set,back,kind)', & '', & ' character(len=*,kind=**),intent(in) :: string', & ' character(len=*,kind=**),intent(in) :: set', & ' logical,intent(in),optional :: back', & ' integer,intent(in),optional :: kind', & '', & 'CHARACTERISTICS', & ' o STRING is a character string of any kind', & '', & ' o SET must be a character string with the same kind as STRING', & '', & ' o BACK is a logical', & '', & ' o KIND is a scalar integer constant expression', & '', & ' o the result is an integer with the kind specified by KIND. If KIND is not', & ' present the result is a default integer.', & '', & 'DESCRIPTION', & ' SCAN(3) scans a STRING for any of the characters in a SET of characters.', & '', & ' If BACK is either absent or equals .false., this function returns the', & ' position of the leftmost character of STRING that is in SET. If BACK equals', & ' .true., the rightmost position is returned. If no character of SET is found', & ' in STRING, the result is zero.', & '', & 'OPTIONS', & ' o STRING : the string to be scanned', & '', & ' o SET : the set of characters which will be matched', & '', & ' o BACK : if .true. the position of the rightmost character matched is', & ' returned, instead of the leftmost.', & '', & ' o KIND : the kind of the returned value is the same as KIND if present.', & ' Otherwise a default integer kind is returned.', & '', & 'RESULT', & ' If BACK is absent or is present with the value false and if STRING contains', & ' at least one character that is in SET, the value of the result is the', & ' position of the leftmost character of STRING that is in SET.', & '', & ' If BACK is present with the value true and if STRING contains at least one', & ' character that is in SET, the value of the result is the position of the', & ' rightmost character of STRING that is in SET.', & '', & ' The value of the result is zero if no character of STRING is in SET or if', & ' the length of STRING or SET is zero.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_scan', & ' implicit none', & ' write(*,*) scan("fortran", "ao") ! 2, found ''o''', & ' write(*,*) scan("fortran", "ao", .true.) ! 6, found ''a''', & ' write(*,*) scan("fortran", "c++") ! 0, found none', & ' end program demo_scan', & '', & ' Results:', & '', & ' > 2', & ' > 6', & ' > 0', & '', & 'STANDARD', & ' Fortran 95 , with KIND argument - Fortran 2003', & '', & 'SEE ALSO', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 scan(3fortran)', & ''] shortname="scan" call process() case('205','select_case') textblock=[character(len=256) :: & '', & 'select_case(7fortran) select_case(7fortran)', & '', & 'NAME', & ' select_case(7f) - [EXECUTION CONTROL] select a block based on the value of', & ' an expression (a case)', & '', & 'SYNOPSIS', & ' The CASE construct selects for execution at most one of its constituent', & ' blocks. The selection is based on the value of an expression.', & '', & ' [ case-construct-name : ] SELECT CASE (case-expr)', & ' CASE (value) [case-construct-name]', & ' [selected code]', & ' CASE ([lower_value]:[upper_value]) [case-construct-name]', & ' [selected code]', & ' CASE (range_or_value,range_or_value,...) [case-construct-name]', & ' [selected code]', & '', & ' CASE DEFAULT', & ' END SELECT [ case-construct-name ]', & '', & ' The expression may be integer,character,or logical. In particular it cannot', & ' be real.', & '', & ' For a given case-construct, there shall be no possible value of the case-', & ' expr that matches more than one case-value-range.', & '', & ' If the select-case-stmt of a case-construct specifies a case-construct-', & ' name, the corresponding end-select-stmt shall specify the same case-', & ' construct-name.', & '', & ' If the select-case-stmt of a case-construct does not specify a case-', & ' construct-name, the corresponding end-select-stmt shall not specify a', & ' case-construct-name.', & '', & ' If a case-stmt specifies a case-construct-name, the corresponding select-', & ' case-stmt shall specify the same case-construct-name.', & '', & ' No more than one of the selectors of one of the CASE statements shall be', & ' DEFAULT.', & '', & ' o For a given case-construct, each case-value shall be of the same type', & ' as case-expr', & '', & ' o For character type, the kind type parameters shall be the same', & '', & ' o character length differences are allowed.', & '', & ' o A case-value-range using a colon shall not be used if case-expr is of', & ' type logical.', & '', & 'DESCRIPTION', & ' The execution of the SELECT CASE statement causes the case expression to be', & ' evaluated. The resulting value is called the case index. For a case value', & ' range list, a match occurs if the case index matches any of the case value', & ' ranges in the list. For a case index with a value of c, a match is', & ' determined as follows.', & '', & ' 1. If the case value range contains a single value v without a colon, a', & ' match occurs for type logical if the expression c .EQV. v is true, and', & ' a match occurs for type integer or character if the expression c == v', & ' is true.', & '', & ' 2. If the case value range is of the form low : high, a match occurs if', & ' the expression low <= c .AND. c <= high is true.', & '', & ' 3. If the case value range is of the form low :, a match occurs if the', & ' expression low <= c is true.', & '', & ' 4. If the case value range is of the form : high, a match occurs if the', & ' expression c <= high is true.', & '', & ' 5. If no other selector matches and a DEFAULT selector appears, it', & ' matches the case index.', & '', & ' 6. If no other selector matches and the DEFAULT selector does not appear,', & ' there is no match.', & '', & ' The block following the CASE statement containing the matching selector, if', & ' any, is executed. This completes execution of the construct.', & '', & ' It is permissible to branch to an end-select-stmt only from within its CASE', & ' construct.', & '', & 'EXAMPLES', & ' An integer signum function:', & '', & ' integer function signum (n)', & ' select case (n)', & ' case (:-1)', & ' signum = -1 ! if <= -1 set to negative 1', & ' case (0)', & ' signum = 0', & ' case (1:)', & ' signum = 1 ! anything >= 1 set to positive 1', & ' end select', & ' end function signum', & '', & ' A code fragment to check for balanced parentheses:', & '', & ' character (80) :: line', & ' ...', & ' level = 0', & ' scan_line: do i = 1, 80', & ' check_parens: select case (line (i:i))', & ' case (''('')', & ' level = level + 1', & ' case ('')'')', & ' level = level - 1', & ' if (level < 0) then', & ' print *, ''unexpected right parenthesis''', & ' exit scan_line', & ' end if', & ' case default', & ' ! ignore all other characters', & ' end select check_parens', & ' end do scan_line', & ' if (level > 0) then', & ' print *, ''missing right parenthesis''', & ' end if', & '', & ' the following three fragments are equivalent:', & '', & ' if (silly == 1) then', & ' call this', & ' else', & ' call that', & ' end if', & '', & ' select case (silly == 1)', & ' case (.true.)', & ' call this', & ' case (.false.)', & ' call that', & ' end select', & '', & ' select case (silly)', & ' case default', & ' call that', & ' case (1)', & ' call this', & ' end select', & '', & ' A code fragment showing several selections of one block:', & '', & ' select case (n)', & ' case (1, 3:5, 8) ! selects 1, 3, 4, 5, 8', & ' call sub()', & ' case default', & ' call other()', & ' end select', & '', & ' March 16, 2025 select_case(7fortran)', & ''] shortname="select_case" call process() case('206','selected_char_kind') textblock=[character(len=256) :: & '', & 'selected_char_kind(3fortran) selected_char_kind(3fortran)', & '', & 'NAME', & ' SELECTED_CHAR_KIND(3) - [KIND] Select character kind such as "Unicode"', & '', & 'SYNOPSIS', & ' result = selected_char_kind(name)', & '', & ' integer function selected_char_kind(name)', & '', & ' character(len=*),intent(in) :: name', & '', & 'CHARACTERISTICS', & ' o NAME is a default character scalar', & '', & ' o the result is a default integer scalar', & '', & 'DESCRIPTION', & ' SELECTED_CHAR_KIND(3) returns a kind parameter value for the character set', & ' named NAME.', & '', & ' If a name is not supported, -1 is returned. Otherwise the result is a value', & ' equal to that kind type parameter value.', & '', & ' The list of supported names is processor-dependent except for "DEFAULT".', & '', & ' o If NAME has the value "DEFAULT", then the result has a value equal to', & ' that of the kind type parameter of default character. This name is always', & ' supported.', & '', & ' o If NAME has the value "ASCII", then the result has a value equal to that', & ' of the kind type parameter of ASCII character.', & '', & ' o If NAME has the value "ISO_10646", then the result has a value equal to', & ' that of the kind type parameter of the ISO 10646 character kind', & ' (corresponding to UCS-4 as specified in ISO/IEC 10646).', & '', & ' o If NAME is a processor-defined name of some other character kind', & ' supported by the processor, then the result has a value equal to that', & ' kind type parameter value. Pre-defined names include "ASCII" and', & ' "ISO_10646".', & '', & ' The NAME is interpreted without respect to case or trailing blanks.', & '', & 'OPTIONS', & ' o NAME : A name to query the processor-dependent kind value of, and/or to', & ' determine if supported. NAME, interpreted without respect to case or', & ' trailing blanks.', & '', & ' Currently, supported character sets include "ASCII" and "DEFAULT" and', & ' "ISO_10646" (Universal Character Set, UCS-4) which is commonly known as', & ' "Unicode". Supported names other than "DEFAULT" are processor dependent.', & '', & 'RESULT', & 'EXAMPLES', & ' Sample program:', & '', & ' Linux', & ' program demo_selected_char_kind', & ' use iso_fortran_env', & ' implicit none', & '', & ' intrinsic date_and_time,selected_char_kind', & '', & ' ! set some aliases for common character kinds', & ' ! as the numbers can vary from platform to platform', & '', & ' integer, parameter :: default = selected_char_kind ("default")', & ' integer, parameter :: ascii = selected_char_kind ("ascii")', & ' integer, parameter :: ucs4 = selected_char_kind (''ISO_10646'')', & ' integer, parameter :: utf8 = selected_char_kind (''utf-8'')', & '', & ' ! assuming ASCII and UCS4 are supported (ie. not equal to -1)', & ' ! define some string variables', & ' character(len=26, kind=ascii ) :: alphabet', & ' character(len=30, kind=ucs4 ) :: hello_world', & ' character(len=30, kind=ucs4 ) :: string', & '', & ' write(*,*)''ASCII '',&', & ' & merge(''Supported '',''Not Supported'',ascii /= -1)', & ' write(*,*)''ISO_10646 '',&', & ' & merge(''Supported '',''Not Supported'',ucs4 /= -1)', & ' write(*,*)''UTF-8 '',&', & ' & merge(''Supported '',''Not Supported'',utf8 /= -1)', & '', & ' if(default.eq.ascii)then', & ' write(*,*)''ASCII is the default on this processor''', & ' endif', & '', & ' ! for constants the kind precedes the value, somewhat like a', & ' ! BOZ constant', & ' alphabet = ascii_"abcdefghijklmnopqrstuvwxyz"', & ' write (*,*) alphabet', & '', & ' hello_world = ucs4_''Hello World and Ni Hao -- '' &', & ' // char (int (z''4F60''), ucs4) &', & ' // char (int (z''597D''), ucs4)', & '', & ' ! an encoding option is required on OPEN for non-default I/O', & ' if(ucs4 /= -1 )then', & ' open (output_unit, encoding=''UTF-8'')', & ' write (*,*) trim (hello_world)', & ' else', & ' write (*,*) ''cannot use utf-8''', & ' endif', & '', & ' call create_date_string(string)', & ' write (*,*) trim (string)', & '', & ' contains', & '', & ' ! The following produces a Japanese date stamp.', & ' subroutine create_date_string(string)', & ' intrinsic date_and_time,selected_char_kind', & ' integer,parameter :: ucs4 = selected_char_kind("ISO_10646")', & ' character(len=1,kind=ucs4),parameter :: &', & ' nen = char(int( z''5e74'' ),ucs4), & ! year', & ' gatsu = char(int( z''6708'' ),ucs4), & ! month', & ' nichi = char(int( z''65e5'' ),ucs4) ! day', & ' character(len= *, kind= ucs4) string', & ' integer values(8)', & ' call date_and_time(values=values)', & ' write(string,101) values(1),nen,values(2),gatsu,values(3),nichi', & ' 101 format(*(i0,a))', & ' end subroutine create_date_string', & '', & ' end program demo_selected_char_kind', & '', & ' Results:', & '', & ' The results are very processor-dependent', & '', & ' > ASCII Supported', & ' > ISO_10646 Supported', & ' > UTF-8 Not Supported', & ' > ASCII is the default on this processor', & ' > abcdefghijklmnopqrstuvwxyz', & ' > Hello World and Ni Hao --', & ' > 20221015', & '', & 'STANDARD', & ' Fortran 2003', & '', & 'SEE ALSO', & ' SELECTED_INT_KIND(3), SELECTED_REAL_KIND(3)', & '', & ' ACHAR(3), CHAR(3), ICHAR(3), IACHAR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 selected_char_kind(3fortran)', & ''] shortname="selected_char_kind" call process() case('207','selected_int_kind') textblock=[character(len=256) :: & '', & 'selected_int_kind(3fortran) selected_int_kind(3fortran)', & '', & 'NAME', & ' SELECTED_INT_KIND(3) - [KIND] Choose integer kind', & '', & 'SYNOPSIS', & ' result = selected_int_kind(r)', & '', & ' integer function selected_int_kind(r)', & '', & ' integer(kind=KIND),intent(in) :: r', & '', & 'CHARACTERISTICS', & ' o R is an integer scalar.', & '', & ' o the result is an default integer scalar.', & '', & 'DESCRIPTION', & ' SELECTED_INT_KIND(3) return the kind value of the smallest integer type that', & ' can represent all values ranging from -10**R (exclusive) to 10**R', & ' (exclusive). If there is no integer kind that accommodates this range,', & ' selected_int_kind returns -1.', & '', & 'OPTIONS', & ' o R : The value specifies the required range of powers of ten that need', & ' supported by the kind type being returned.', & '', & 'RESULT', & ' The result has a value equal to the value of the kind type parameter of an', & ' integer type that represents all values in the requested range.', & '', & ' if no such kind type parameter is available on the processor, the result is', & ' -1.', & '', & ' If more than one kind type parameter meets the criterion, the value returned', & ' is the one with the smallest decimal exponent range, unless there are', & ' several such values, in which case the smallest of these kind values is', & ' returned.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_selected_int_kind', & ' implicit none', & ' integer,parameter :: k5 = selected_int_kind(5)', & ' integer,parameter :: k15 = selected_int_kind(15)', & ' integer(kind=k5) :: i5', & ' integer(kind=k15) :: i15', & '', & ' print *, huge(i5), huge(i15)', & '', & ' ! the following inequalities are always true', & ' print *, huge(i5) >= 10_k5**5-1', & ' print *, huge(i15) >= 10_k15**15-1', & ' end program demo_selected_int_kind', & '', & ' Results:', & '', & ' > 2147483647 9223372036854775807', & ' > T', & ' > T', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' AINT(3), ANINT(3), INT(3), NINT(3), CEILING(3), FLOOR(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 selected_int_kind(3fortran)', & ''] shortname="selected_int_kind" call process() case('208','selected_real_kind') textblock=[character(len=256) :: & '', & 'selected_real_kind(3fortran) selected_real_kind(3fortran)', & '', & 'NAME', & ' SELECTED_REAL_KIND(3) - [KIND] Choose real kind', & '', & 'SYNOPSIS', & ' result = selected_real_kind([p] [,r] [,radix] )', & '', & ' integer function selected_int_kind(r)', & '', & ' real(kind=KIND),intent(in),optional :: p', & ' real(kind=KIND),intent(in),optional :: r', & ' real(kind=KIND),intent(in),optional :: radix', & '', & 'CHARACTERISTICS', & ' o P is an integer scalar', & '', & ' o R is an integer scalar', & '', & ' o RADIX is an integer scalar', & '', & ' o the result is an default integer scalar', & '', & 'DESCRIPTION', & ' SELECTED_REAL_KIND(3) return the kind value of a real data type with decimal', & ' precision of at least P digits, exponent range of at least R, and with a', & ' radix of RADIX. That is, if such a kind exists', & '', & ' o it has the decimal precision as returned by PRECISION(3) of at least P', & ' digits.', & '', & ' o a decimal exponent range, as returned by the function RANGE(3) of at', & ' least R', & '', & ' o a radix, as returned by the function RADIX(3) , of RADIX,', & '', & ' If the requested kind does not exist, -1 is returned.', & '', & ' At least one argument shall be present.', & '', & 'OPTIONS', & ' o P : the requested precision', & '', & ' o R : the requested range', & '', & ' o RADIX : the desired radix', & '', & ' Before FORTRAN 2008, at least one of the arguments R or P shall be', & ' present; since FORTRAN 2008, they are assumed to be zero if absent.', & '', & 'RESULT', & ' selected_real_kind returns the value of the kind type parameter of a real', & ' data type with decimal precision of at least P digits, a decimal exponent', & ' range of at least R, and with the requested RADIX.', & '', & ' If P or R is absent, the result value is the same as if it were present with', & ' the value zero.', & '', & ' If the RADIX parameter is absent, there is no requirement on the radix of', & ' the selected kind and real kinds with any radix can be returned.', & '', & ' If more than one real data type meet the criteria, the kind of the data type', & ' with the smallest decimal precision is returned. If no real data type', & ' matches the criteria, the result is', & '', & ' o -1 : if the processor does not support a real data type with a precision', & ' greater than or equal to P, but the R and RADIX requirements can be', & ' fulfilled', & '', & ' o -2 : if the processor does not support a real type with an exponent range', & ' greater than or equal to R, but P and RADIX are fulfillable', & '', & ' o -3 : if RADIX but not P and R requirements are fulfillable', & '', & ' o -4 : if RADIX and either P or R requirements are fulfillable', & '', & ' o -5 : if there is no real type with the given RADIX', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_selected_real_kind', & ' implicit none', & ' integer,parameter :: p6 = selected_real_kind(6)', & ' integer,parameter :: p10r100 = selected_real_kind(10,100)', & ' integer,parameter :: r400 = selected_real_kind(r=400)', & ' real(kind=p6) :: x', & ' real(kind=p10r100) :: y', & ' real(kind=r400) :: z', & '', & ' print *, precision(x), range(x)', & ' print *, precision(y), range(y)', & ' print *, precision(z), range(z)', & ' end program demo_selected_real_kind', & '', & ' Results:', & '', & ' > 6 37', & ' > 15 307', & ' > 18 4931', & '', & 'STANDARD', & ' Fortran 95 ; with RADIX - Fortran 2008', & '', & 'SEE ALSO', & ' PRECISION(3), RANGE(3), RADIX(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 selected_real_kind(3fortran)', & ''] shortname="selected_real_kind" call process() case('209','set_exponent') textblock=[character(len=256) :: & '', & 'set_exponent(3fortran) set_exponent(3fortran)', & '', & 'NAME', & ' SET_EXPONENT(3) - [MODEL:COMPONENTS] real value with specified exponent', & '', & 'SYNOPSIS', & ' result = set_exponent(x, i)', & '', & ' elemental real(kind=KIND) function set_exponent(x,i)', & '', & ' real(kind=KIND),intent(in) :: x', & ' integer(kind=**),intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o X is type real', & '', & ' o I is type integer', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o The return value is of the same type and kind as X.', & '', & 'DESCRIPTION', & ' SET_EXPONENT(3) returns the real number whose fractional part is that of X', & ' and whose exponent part is I.', & '', & 'OPTIONS', & ' o X : Shall be of type real.', & '', & ' o I : Shall be of type integer.', & '', & 'RESULT', & ' The return value is of the same type and kind as X. The real number whose', & ' fractional part is that of X and whose exponent part if I is returned; it is', & ' FRACTION(X) * REAL(RADIX(X))**I.', & '', & ' If X has the value zero, the result has the same value as X.', & '', & ' If X is an IEEE infinity, the result is an IEEE NaN.', & '', & ' If X is an IEEE NaN, the result is the same NaN.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_setexp', & ' implicit none', & ' real :: x = 178.1387e-4', & ' integer :: i = 17', & ' print *, set_exponent(x, i), fraction(x) * real(radix(x))**i', & ' end program demo_setexp', & '', & ' Results:', & '', & ' > 74716.7891 74716.7891', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3),', & ' SCALE(3), SPACING(3), TINY(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 set_exponent(3fortran)', & ''] shortname="set_exponent" call process() case('210','shape') textblock=[character(len=256) :: & '', & 'shape(3fortran) shape(3fortran)', & '', & 'NAME', & ' SHAPE(3) - [ARRAY:INQUIRY] Determine the shape of an array or scalar', & '', & 'SYNOPSIS', & ' result = shape( source [,kind] )', & '', & ' integer(kind=KIND) function shape( source, KIND )', & '', & ' type(TYPE(kind=**)),intent(in) :: source(..)', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o SOURCE is an array or scalar of any type. If SOURCE is a pointer it must', & ' be associated and allocatable arrays must be allocated. It shall not be', & ' an assumed-size array.', & '', & ' o KIND is a constant integer initialization expression.', & '', & ' o the result is an integer array of rank one with size equal to the rank of', & ' SOURCE of the kind specified by KIND if KIND is present, otherwise it has', & ' the default integer kind.', & '', & 'DESCRIPTION', & ' SHAPE(3) queries the shape of an array.', & '', & 'OPTIONS', & ' o SOURCE : an array or scalar of any type. If SOURCE is a pointer it must', & ' be associated and allocatable arrays must be allocated.', & '', & ' o KIND : indicates the kind parameter of the result.', & '', & 'RESULT', & ' An integer array of rank one with as many elements as SOURCE has dimensions.', & '', & ' The elements of the resulting array correspond to the extent of SOURCE along', & ' the respective dimensions.', & '', & ' If SOURCE is a scalar, the result is an empty array (a rank-one array of', & ' size zero).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_shape', & ' implicit none', & ' character(len=*),parameter :: all=''(*(g0,1x))''', & ' integer, dimension(-1:1, -1:2) :: a', & ' print all, ''shape of array='',shape(a)', & ' print all, ''shape of constant='',shape(42)', & ' print all, ''size of shape of constant='',size(shape(42))', & ' print all, ''ubound of array='',ubound(a)', & ' print all, ''lbound of array='',lbound(a)', & ' end program demo_shape', & '', & ' Results:', & '', & ' > shape of array= 3 4', & ' > shape of constant=', & ' > size of shape of constant= 0', & ' > ubound of array= 1 2', & ' > lbound of array= -1 -1', & '', & 'STANDARD', & ' Fortran 95 ; with KIND argument Fortran 2003', & '', & 'SEE ALSO', & ' Array inquiry:', & '', & ' o SIZE(3) - Determine the size of an array', & '', & ' o RANK(3) - Rank of a data object', & '', & ' o UBOUND(3) - Upper dimension bounds of an array', & '', & ' o LBOUND(3) - Lower dimension bounds of an array', & '', & ' State Inquiry:', & '', & ' o ALLOCATED(3) - Status of an allocatable entity', & '', & ' o IS_CONTIGUOUS(3) - Test if object is contiguous', & '', & ' Kind Inquiry:', & '', & ' o KIND(3) - Kind of an entity', & '', & ' Bit Inquiry:', & '', & ' o STORAGE_SIZE(3) - Storage size in bits', & '', & ' o BIT_SIZE(3) - Bit size inquiry function', & '', & ' o BTEST(3) - Tests a bit of an integer value.', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 shape(3fortran)', & ''] shortname="shape" call process() case('211','shifta') textblock=[character(len=256) :: & '', & 'shifta(3fortran) shifta(3fortran)', & '', & 'NAME', & ' SHIFTA(3) - [BIT:SHIFT] Right shift with fill', & '', & 'SYNOPSIS', & ' result = shifta(i, shift )', & '', & ' elemental integer(kind=KIND) function shifta(i, shift)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=**),intent(in) :: shift', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o I is an integer of any kind', & '', & ' o SHIFT is an integer of any kind', & '', & ' o the result will automatically be of the same type, kind and rank as I.', & '', & 'DESCRIPTION', & ' SHIFTA(3) returns a value corresponding to I with all of the bits shifted', & ' right by SHIFT places and the vacated bits on the left filled with the value', & ' of the original left-most bit.', & '', & 'OPTIONS', & ' o I : The initial value to shift and fill', & '', & ' o SHIFT : how many bits to shift right. It shall be nonnegative and less', & ' than or equal to BIT_SIZE(I). or the value is undefined. If SHIFT is zero', & ' the result is I.', & '', & 'RESULT', & ' The result has the value obtained by shifting the bits of I to the right', & ' SHIFT bits and replicating the leftmost bit of I in the left SHIFT bits', & ' (Note the leftmost bit in "two''s complement" representation is the sign', & ' bit).', & '', & ' Bits shifted out from the right end are lost.', & '', & ' If SHIFT is zero the result is I.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_shifta', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer(kind=int32) :: ival', & ' integer :: shift', & ' integer(kind=int32) :: oval', & ' integer(kind=int32),allocatable :: ivals(:)', & ' integer :: i', & ' integer(kind=int8) :: arr(2,2)=reshape([2,4,8,16],[2,2])', & '', & ' ! basic usage', & ' write(*,*)shifta(100,3)', & '', & ' ! loop through some interesting values', & ' shift=5', & '', & ' ivals=[ -1, -0, +0, +1, &', & ' & int(b"01010101010101010101010101010101"), &', & ' & int(b"10101010101010101010101010101010"), &', & ' & int(b"00000000000000000000000000011111") ]', & '', & ' ! does your platform distinguish between +0 and -0?', & ' ! note the original leftmost bit is used to fill in the vacated bits', & '', & ' write(*,''(/,"SHIFT = ",i0)'') shift', & ' do i=1,size(ivals)', & ' ival=ivals(i)', & ' write(*,''( "I = ",b32.32," == ",i0)'') ival,ival', & ' oval=shifta(ival,shift)', & ' write(*,''( "RESULT = ",b32.32," == ",i0)'') oval,oval', & ' enddo', & ' ! elemental', & ' write(*,*)"characteristics of the result are the same as input"', & ' write(*,''(*(g0,1x))'') &', & ' & "kind=",kind(shifta(arr,3)), "shape=",shape(shifta(arr,3)), &', & ' & "size=",size(shifta(arr,3)) !, "rank=",rank(shifta(arr,3))', & '', & ' end program demo_shifta', & '', & ' Results:', & '', & ' > 12', & ' >', & ' > SHIFT = 5', & ' > I = 11111111111111111111111111111111 == -1', & ' > RESULT = 11111111111111111111111111111111 == -1', & ' > I = 00000000000000000000000000000000 == 0', & ' > RESULT = 00000000000000000000000000000000 == 0', & ' > I = 00000000000000000000000000000000 == 0', & ' > RESULT = 00000000000000000000000000000000 == 0', & ' > I = 00000000000000000000000000000001 == 1', & ' > RESULT = 00000000000000000000000000000000 == 0', & ' > I = 01010101010101010101010101010101 == 1431655765', & ' > RESULT = 00000010101010101010101010101010 == 44739242', & ' > I = 10101010101010101010101010101010 == -1431655766', & ' > RESULT = 11111101010101010101010101010101 == -44739243', & ' > I = 00000000000000000000000000011111 == 31', & ' > RESULT = 00000000000000000000000000000000 == 0', & ' > characteristics of the result are the same as input', & ' > kind= 1 shape= 2 2 size= 4', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' SHIFTL(3), SHIFTR(3), ISHFT(3), ISHFTC(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 shifta(3fortran)', & ''] shortname="shifta" call process() case('212','shiftl') textblock=[character(len=256) :: & '', & 'shiftl(3fortran) shiftl(3fortran)', & '', & 'NAME', & ' SHIFTL(3) - [BIT:SHIFT] Shift bits left', & '', & 'SYNOPSIS', & ' result = shiftl( i, shift )', & '', & ' elemental integer(kind=KIND) function shiftl(i, shift)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=**),intent(in) :: shift', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o I is an integer of any kind', & '', & ' o SHIFT is an integer of any kind', & '', & ' o the result will automatically be of the same type, kind and rank as I.', & '', & 'DESCRIPTION', & ' SHIFTL(3) returns a value corresponding to I with all of the bits shifted', & ' left by SHIFT places.', & '', & ' Bits shifted out from the left end are lost, and bits shifted in from the', & ' right end are set to 0.', & '', & ' If the absolute value of SHIFT is greater than BIT_SIZE(I), the value is', & ' undefined.', & '', & ' For example, for a 16-bit integer left-shifted five ...', & '', & ' > |a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p| <- original 16-bit example', & ' > |f|g|h|i|j|k|l|m|n|o|p| <- left-shifted five', & ' > |f|g|h|i|j|k|l|m|n|o|p|0|0|0|0|0| <- right-padded with zeros', & '', & ' Note the value of the result is the same as ISHFT (I, SHIFT).', & '', & 'OPTIONS', & ' o I : The initial value to shift and fill in with zeros', & '', & ' o SHIFT : how many bits to shift left. It shall be nonnegative and less', & ' than or equal to BIT_SIZE(I).', & '', & 'RESULT', & ' The return value is of type integer and of the same kind as I.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_shiftl', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: shift', & ' integer(kind=int32) :: oval', & ' integer(kind=int32) :: ival', & ' integer(kind=int32),allocatable :: ivals(:)', & ' integer :: i', & '', & ' print *, '' basic usage''', & ' ival=100', & ' write(*,*)ival, shiftl(ival,3)', & '', & ' ! elemental (input values may be conformant arrays)', & ' print *, '' elemental''', & '', & ' ! loop through some ivalues', & ' shift=9', & ' ivals=[ &', & ' & int(b"01010101010101010101010101010101"), &', & ' & int(b"10101010101010101010101010101010"), &', & ' & int(b"11111111111111111111111111111111") ]', & '', & ' write(*,''(/,"SHIFT = ",i0)'') shift', & ' do i=1,size(ivals)', & ' ! print initial value as binary and decimal', & ' write(*,''( "I = ",b32.32," == ",i0)'') ivals(i),ivals(i)', & ' ! print shifted value as binary and decimal', & ' oval=shiftl(ivals(i),shift)', & ' write(*,''( "RESULT = ",b32.32," == ",i0)'') oval,oval', & ' enddo', & '', & ' ! more about elemental', & ' ELEM : block', & ' integer(kind=int8) :: arr(2,2)=reshape([2,4,8,16],[2,2])', & ' write(*,*)"characteristics of the result are the same as input"', & ' write(*,''(*(g0,1x))'') &', & ' & "kind=",kind(shiftl(arr,3)), "shape=",shape(shiftl(arr,3)), &', & ' & "size=",size(shiftl(arr,3)) !, "rank=",rank(shiftl(arr,3))', & ' endblock ELEM', & '', & ' end program demo_shiftl', & '', & ' Results:', & '', & ' > basic usage', & ' > 100 800', & ' > elemental', & ' >', & ' > SHIFT = 9', & ' > I = 01010101010101010101010101010101 == 1431655765', & ' > RESULT = 10101010101010101010101000000000 == -1431655936', & ' > I = 10101010101010101010101010101010 == -1431655766', & ' > RESULT = 01010101010101010101010000000000 == 1431655424', & ' > I = 11111111111111111111111111111111 == -1', & ' > RESULT = 11111111111111111111111000000000 == -512', & ' > characteristics of the result are the same as input', & ' > kind= 1 shape= 2 2 size= 4', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' SHIFTA(3), SHIFTR(3), ISHFT(3), ISHFTC(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 shiftl(3fortran)', & ''] shortname="shiftl" call process() case('213','shiftr') textblock=[character(len=256) :: & '', & 'shiftr(3fortran) shiftr(3fortran)', & '', & 'NAME', & ' SHIFTR(3) - [BIT:SHIFT] Shift bits right', & '', & 'SYNOPSIS', & ' result = shiftr( i, shift )', & '', & ' elemental integer(kind=KIND) function shiftr(i, shift)', & '', & ' integer(kind=KIND),intent(in) :: i', & ' integer(kind=**),intent(in) :: shift', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o I is an integer of any kind', & '', & ' o SHIFT is an integer of any kind', & '', & ' o the result will automatically be of the same type, kind and rank as I.', & '', & 'DESCRIPTION', & ' SHIFTR(3) returns a value corresponding to I with all of the bits shifted', & ' right by SHIFT places.', & '', & ' If the absolute value of SHIFT is greater than BIT_SIZE(I), the value is', & ' undefined.', & '', & ' Bits shifted out from the right end are lost, and bits shifted in from the', & ' left end are set to 0.', & '', & ' For example, for a 16-bit integer right-shifted five ...', & '', & ' > |a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p| <- original 16-bit example', & ' > |a|b|c|d|e|f|g|h|i|j|k| <- right-shifted five', & ' > |0|0|0|0|0|f|g|h|i|j|k|l|m|n|o|p| <- left-padded with zeros', & '', & ' Note the value of the result is the same as ISHFT (I, -SHIFT).', & '', & 'OPTIONS', & ' o I : The value to shift', & '', & ' o SHIFT : How many bits to shift right. It shall be nonnegative and less', & ' than or equal to BIT_SIZE(I).', & '', & 'RESULT', & ' The remaining bits shifted right SHIFT positions. Vacated positions on the', & ' left are filled with zeros.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_shiftr', & ' use,intrinsic :: iso_fortran_env, only : int8, int16, int32, int64', & ' implicit none', & ' integer :: shift', & ' integer(kind=int32) :: oval', & ' integer(kind=int32) :: ival', & ' integer(kind=int32),allocatable :: ivals(:)', & ' integer :: i', & '', & ' print *,'' basic usage''', & ' ival=100', & ' write(*,*)ival, shiftr(100,3)', & '', & ' ! elemental (input values may be conformant arrays)', & ' print *,'' elemental''', & ' shift=9', & ' ivals=[ &', & ' & int(b"01010101010101010101010101010101"), &', & ' & int(b"10101010101010101010101010101010"), &', & ' & int(b"11111111111111111111111111111111") ]', & '', & ' write(*,''(/,"SHIFT = ",i0)'') shift', & ' do i=1,size(ivals)', & ' ! print initial value as binary and decimal', & ' write(*,''( "I = ",b32.32," == ",i0)'') ivals(i),ivals(i)', & ' ! print shifted value as binary and decimal', & ' oval=shiftr(ivals(i),shift)', & ' write(*,''( "RESULT = ",b32.32," == ",i0,/)'') oval,oval', & ' enddo', & '', & ' ! more on elemental', & ' ELEM : block', & ' integer(kind=int8) :: arr(2,2)=reshape([2,4,8,16],[2,2])', & ' write(*,*)"characteristics of the result are the same as input"', & ' write(*,''(*(g0,1x))'') &', & ' & "kind=",kind(shiftr(arr,3)), "shape=",shape(shiftr(arr,3)), &', & ' & "size=",size(shiftr(arr,3)) !, "rank=",rank(shiftr(arr,3))', & ' endblock ELEM', & '', & ' end program demo_shiftr', & '', & ' Results:', & '', & ' > basic usage', & ' > 100 12', & ' > elemental', & ' >', & ' > SHIFT = 9', & ' > I = 01010101010101010101010101010101 == 1431655765', & ' > RESULT = 00000000001010101010101010101010 == 2796202', & ' >', & ' > I = 10101010101010101010101010101010 == -1431655766', & ' > RESULT = 00000000010101010101010101010101 == 5592405', & ' >', & ' > I = 11111111111111111111111111111111 == -1', & ' > RESULT = 00000000011111111111111111111111 == 8388607', & ' >', & ' > characteristics of the result are the same as input', & ' > kind= 1 shape= 2 2 size= 4', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' SHIFTA(3), SHIFTL(3), ISHFT(3), ISHFTC(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 shiftr(3fortran)', & ''] shortname="shiftr" call process() case('214','sign') textblock=[character(len=256) :: & '', & 'sign(3fortran) sign(3fortran)', & '', & 'NAME', & ' SIGN(3) - [NUMERIC] Sign copying function', & '', & 'SYNOPSIS', & ' result = sign(a, b)', & '', & ' elemental type(TYPE(kind=KIND))function sign(a, b)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: a, b', & '', & 'CHARACTERISTICS', & ' o A shall be of type integer or real.', & '', & ' o B shall be of the same type as A.', & '', & ' o the characteristics of the result are the same as A.', & '', & 'DESCRIPTION', & ' SIGN(3) returns a value with the magnitude of a but with the sign of b.', & '', & ' For processors that distinguish between positive and negative zeros sign()', & ' may be used to distinguish between real values 0.0 and -0.0. SIGN (1.0,', & ' -0.0) will return -1.0 when a negative zero is distinguishable.', & '', & 'OPTIONS', & ' o A : The value whose magnitude will be returned.', & '', & ' o B : The value whose sign will be returned.', & '', & 'RESULT', & ' a value with the magnitude of A with the sign of B. That is,', & '', & ' o If b >= 0 then the result is abs(a)', & '', & ' o else if b < 0 it is -abs(a).', & '', & ' o if b is real and the processor distinguishes between -0.0 and 0.0 then', & ' the result is -abs(a)', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_sign', & ' implicit none', & ' ! basics', & ' print *, sign( -12, 1 )', & ' print *, sign( -12, 0 )', & ' print *, sign( -12, -1 )', & ' print *, sign( 12, 1 )', & ' print *, sign( 12, 0 )', & ' print *, sign( 12, -1 )', & '', & ' if(sign(1.0,-0.0)== -1.0)then', & ' print *, ''this processor distinguishes +0 from -0''', & ' else', & ' print *, ''this processor does not distinguish +0 from -0''', & ' endif', & '', & ' print *, ''elemental'', sign( -12.0, [1.0, 0.0, -1.0] )', & '', & ' end program demo_sign', & '', & ' Results:', & '', & ' > 12', & ' > 12', & ' > -12', & ' > 12', & ' > 12', & ' > -12', & ' > this processor does not distinguish +0 from -0', & ' > elemental 12.00000 12.00000 -12.00000', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' ABS(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 sign(3fortran)', & ''] shortname="sign" call process() case('215','sin') textblock=[character(len=256) :: & '', & 'sin(3fortran) sin(3fortran)', & '', & 'NAME', & ' SIN(3) - [MATHEMATICS:TRIGONOMETRIC] Sine function', & '', & 'SYNOPSIS', & ' result = sin(x)', & '', & ' elemental TYPE(kind=KIND) function sin(x)', & '', & ' TYPE(kind=KIND) :: x', & '', & 'CHARACTERISTICS', & ' o X may be any real or complex type', & '', & ' o KIND may be any kind supported by the associated type of X.', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' SIN(3) computes the sine of an angle given the size of the angle in radians.', & '', & ' The sine of an angle in a right-angled triangle is the ratio of the length', & ' of the side opposite the given angle divided by the length of the', & ' hypotenuse.', & '', & 'OPTIONS', & ' o X : The angle in radians to compute the sine of.', & '', & 'RESULT', & ' The return value contains the processor-dependent approximation of the sine', & ' of X', & '', & ' If X is of type real, it is regarded as a value in radians.', & '', & ' If X is of type complex, its real part is regarded as a value in radians.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program sample_sin', & ' implicit none', & ' real :: x = 0.0', & ' x = sin(x)', & ' write(*,*)''X='',x', & ' end program sample_sin', & '', & ' Results:', & '', & ' > X= 0.0000000E+00', & '', & ' Extended Example', & '', & ' Haversine Formula', & '', & ' From the article on "Haversine formula" in Wikipedia:', & '', & ' The haversine formula is an equation important in navigation,', & ' giving great-circle distances between two points on a sphere from', & ' their longitudes and latitudes.', & '', & ' So to show the great-circle distance between the Nashville International', & ' Airport (BNA) in TN, USA, and the Los Angeles International Airport (LAX) in', & ' CA, USA you would start with their latitude and longitude, commonly given as', & '', & ' BNA: N 36 degrees 7.2'', W 86 degrees 40.2''', & ' LAX: N 33 degrees 56.4'', W 118 degrees 24.0''', & '', & ' which converted to floating-point values in degrees is:', & '', & ' o BNA latitude=36.12, longitude=-86.67', & '', & ' o LAX latitude=33.94, longitude=-118.40', & '', & ' And then use the haversine formula to roughly calculate the distance along', & ' the surface of the Earth between the locations:', & '', & ' Sample program:', & '', & ' program demo_sin', & ' implicit none', & ' real :: d', & ' d = haversine(36.12,-86.67, 33.94,-118.40) ! BNA to LAX', & ' print ''(*(A,1x,F9.4,1x))'',''distance:'',d,''km, or'',d*0.62137119,''miles''', & ' contains', & ' function haversine(latA,lonA,latB,lonB) result (dist)', & ' !', & ' ! calculate great circle distance in kilometers', & ' ! given latitude and longitude in degrees', & ' !', & ' real,intent(in) :: latA,lonA,latB,lonB', & ' real :: a,c,dist,delta_lat,delta_lon,lat1,lat2', & ' real,parameter :: radius = 6371 ! mean earth radius in kilometers,', & ' ! recommended by the International Union of Geodesy and Geophysics', & '', & ' ! generate constant pi/180', & ' real, parameter :: deg_to_rad = atan(1.0)/45.0', & ' delta_lat = deg_to_rad*(latB-latA)', & ' delta_lon = deg_to_rad*(lonB-lonA)', & ' lat1 = deg_to_rad*(latA)', & ' lat2 = deg_to_rad*(latB)', & ' a = (sin(delta_lat/2))**2 + &', & ' & cos(lat1)*cos(lat2)*(sin(delta_lon/2))**2', & ' c = 2*asin(sqrt(a))', & ' dist = radius*c', & ' end function haversine', & ' end program demo_sin', & '', & ' Results:', & '', & ' > distance: 2886.4446 km, or 1793.5536 miles', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' ASIN(3), COS(3), TAN(3), ACOSH(3), ACOS(3), ASINH(3), ATAN2(3), ATANH(3),', & ' ACOSH(3), ASINH(3), ATANH(3)', & '', & 'RESOURCES', & ' o Wikipedia:sine and cosine', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 sin(3fortran)', & ''] shortname="sin" call process() case('216','sind') textblock=[character(len=256) :: & '', & 'sind(3fortran) sind(3fortran)', & '', & 'NAME', & ' SIND(3) - [MATHEMATICS:TRIGONOMETRIC] Degree sine function', & '', & 'SYNOPSIS', & ' result = sind(x)', & '', & ' elemental real(kind=KIND) function sind(x)', & '', & ' real(kind=KIND) :: x', & '', & 'CHARACTERISTICS', & ' o X may be any real type', & '', & ' o KIND may be any kind supported by the associated real type of X.', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' SIND(3) computes the sine of an angle given the size of the angle in', & ' degrees.', & '', & ' The sine of an angle in a right-angled triangle is the ratio of the length', & ' of the side opposite the given angle divided by the length of the', & ' hypotenuse.', & '', & 'OPTIONS', & ' o X : The angle in degrees to compute the sine of.', & '', & 'RESULT', & ' The return value contains the processor-dependent approximation of the sine', & ' of X, which is regarded as a value in degrees.', & '', & 'EXAMPLES', & ' sind(180.0) has the value 0.0 (approximately).', & '', & ' Sample program:', & '', & ' program sample_sind', & ' implicit none', & ' write(*,*)''sind(0.0)='',sind(0.0)', & ' write(*,*)''sind(45.0)='',sind(45.0)', & ' write(*,*)''sind(90.0)='',sind(90.0)', & ' write(*,*)''sind(180.0)='',sind(180.0)', & ' write(*,*)''sind(270.0)='',sind(270.0)', & ' write(*,*)''sind(720.0)='',sind(720.0)', & ' write(*,*)''sind(-720.0d0)='',sind(-720.0d0)', & ' end program sample_sind', & '', & ' Extended Example', & '', & ' Haversine Formula', & '', & ' From the article on "Haversine formula" in Wikipedia:', & '', & ' The haversine formula is an equation important in navigation,', & ' giving great-circle distances between two points on a sphere from', & ' their longitudes and latitudes.', & '', & ' So to show the great-circle distance between the Nashville International', & ' Airport (BNA) in TN, USA, and the Los Angeles International Airport (LAX) in', & ' CA, USA you would start with their latitude and longitude, commonly given as', & '', & ' BNA: N 36 degrees 7.2'', W 86 degrees 40.2''', & ' LAX: N 33 degrees 56.4'', W 118 degrees 24.0''', & '', & ' which converted to floating-point values in degrees is:', & '', & ' o BNA latitude=36.12, longitude=-86.67', & '', & ' o LAX latitude=33.94, longitude=-118.40', & '', & ' And then use the haversine formula to roughly calculate the distance along', & ' the surface of the Earth between the locations:', & '', & ' Sample program:', & '', & ' program demo_sin', & ' implicit none', & ' real :: d', & ' d = haversine(36.12,-86.67, 33.94,-118.40) ! BNA to LAX', & ' print ''(A,F9.4,A)'', ''distance: '',d,'' km''', & ' contains', & ' function haversine(latA,lonA,latB,lonB) result (dist)', & ' !', & ' ! calculate great circle distance in kilometers', & ' ! given latitude and longitude in degrees', & ' !', & ' real,intent(in) :: latA,lonA,latB,lonB', & ' real :: a,c,dist,delta_lat,delta_lon,lat1,lat2', & ' real,parameter :: radius = 6371 ! mean earth radius in kilometers,', & ' ! recommended by the International Union of Geodesy and Geophysics', & '', & ' delta_lat = latB-latA', & ' delta_lon = lonB-lonA', & ' lat1 = latA', & ' lat2 = latB', & ' a = (sind(delta_lat/2))**2 + &', & ' & cosd(lat1)*cosd(lat2)*(sind(delta_lon/2))**2', & ' c = 2*asin(sqrt(a))', & ' dist = radius*c', & ' end function haversine', & ' end program demo_sin', & '', & ' Results:', & '', & ' > distance: 2886.4446 km', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' ASIN(3), COS(3), TAN(3), ACOSH(3), ACOS(3), ASINH(3), ATAN2(3), ATANH(3),', & ' ACOSH(3), ASINH(3), ATANH(3)', & '', & 'RESOURCES', & ' o Wikipedia:sine and cosine', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 sind(3fortran)', & ''] shortname="sind" call process() case('217','sinh') textblock=[character(len=256) :: & '', & 'sinh(3fortran) sinh(3fortran)', & '', & 'NAME', & ' SINH(3) - [MATHEMATICS:TRIGONOMETRIC] Hyperbolic sine function', & '', & 'SYNOPSIS', & ' result = sinh(x)', & '', & ' elemental TYPE(kind=KIND) function sinh(x)', & '', & ' TYPE(kind=KIND) :: x', & '', & 'CHARACTERISTICS', & ' o TYPE may be real or complex', & '', & ' o KIND may be any kind supported by the associated type.', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' SINH(3) computes the hyperbolic sine of X.', & '', & ' The hyperbolic sine of x is defined mathematically as:', & '', & ' sinh(x) = (exp(x) - exp(-x)) / 2.0', & '', & 'OPTIONS', & ' o X : The value to calculate the hyperbolic sine of', & '', & 'RESULT', & ' The result has a value equal to a processor-dependent approximation to', & ' sinh(X). If X is of type complex its imaginary part is regarded as a value', & ' in radians.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_sinh', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = - 1.0_real64', & ' real(kind=real64) :: nan, inf', & ' character(len=20) :: line', & '', & ' ! basics', & ' print *, sinh(x)', & ' print *, (exp(x)-exp(-x))/2.0', & '', & ' ! sinh(3) is elemental and can handle an array', & ' print *, sinh([x,2.0*x,x/3.0])', & '', & ' ! a NaN input returns NaN', & ' line=''NAN''', & ' read(line,*) nan', & ' print *, sinh(nan)', & '', & ' ! a Inf input returns Inf', & ' line=''Infinity''', & ' read(line,*) inf', & ' print *, sinh(inf)', & '', & ' ! an overflow returns Inf', & ' x=huge(0.0d0)', & ' print *, sinh(x)', & '', & ' end program demo_sinh', & '', & ' Results:', & '', & ' > -1.1752011936438014', & ' > -1.1752011936438014', & ' > -1.1752011936438014 -3.6268604078470190 -0.33954055725615012', & ' > NaN', & ' > Infinity', & ' > Infinity', & '', & 'STANDARD', & ' Fortran 95 , for a complex argument Fortran 2008', & '', & 'SEE ALSO', & ' ASINH(3)', & '', & 'RESOURCES', & ' o Wikipedia:hyperbolic functions', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 sinh(3fortran)', & ''] shortname="sinh" call process() case('218','sinpi') textblock=[character(len=256) :: & '', & 'sinpi(3fortran) sinpi(3fortran)', & '', & 'NAME', & ' SINPI(3) - [MATHEMATICS:TRIGONOMETRIC] Circular sine function', & '', & 'SYNOPSIS', & ' result = sinpi(x)', & '', & ' elemental real(kind=KIND) function sinpi(x)', & '', & ' real(kind=KIND) :: x', & '', & 'CHARACTERISTICS', & ' o X may be any real', & '', & ' o KIND may be any kind supported by the associated real type of X.', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' SINPI(3) computes the circular sine of an angle given the size of the angle', & ' in half-revolutions.', & '', & ' SINPI(X) is approximately equal to SIN(X*PI).', & '', & ' The sine of an angle in a right-angled triangle is the ratio of the length', & ' of the side opposite the given angle divided by the length of the', & ' hypotenuse.', & '', & 'OPTIONS', & ' o X : The angle in half-revolutions to compute the sine of.', & '', & 'RESULT', & ' The return value contains the processor-dependent approximation of the sine', & ' of X.', & '', & 'EXAMPLES', & ' Example. SINPI(1.0) has the value 0.0 (approximately).', & '', & ' Sample program:', & '', & ' program demo_sinpi', & ' implicit none', & ' real :: x', & ' integer :: i', & ' real,parameter :: PI=acos(-1.0)', & ' do i=0,8', & ' x=i*0.25', & ' write(*,*)''x='',x,'' sinpi(x)='',sinpi(x)', & ' enddo', & ' end program demo_sinpi', & '', & ' Results:', & '', & ' > x= 0.00000000 sinpi(x)= 0.00000000', & ' > x= 0.250000000 sinpi(x)= 0.707106769', & ' > x= 0.500000000 sinpi(x)= 1.00000000', & ' > x= 0.750000000 sinpi(x)= 0.707106769', & ' > x= 1.00000000 sinpi(x)= -8.74227766E-08', & ' > x= 1.25000000 sinpi(x)= -0.707106888', & ' > x= 1.50000000 sinpi(x)= -1.00000000', & ' > x= 1.75000000 sinpi(x)= -0.707106531', & ' > x= 2.00000000 sinpi(x)= 1.74845553E-07', & '', & 'STANDARD', & ' fortran 2023', & '', & 'SEE ALSO', & ' o ACOS(3), ACOSD(3), ACOSPI(3),', & '', & ' o ASIN(3), ASIND(3),', & '', & ' o ATAN2(3), ATAN2D(3), ATAN2PI(3),', & '', & ' o COS(3), COSD(3), COSPI(3),', & '', & ' o TAN(3), TAND(3), TANPI(3),', & '', & ' o ACOSH(3),', & '', & ' o ACOSH(3),', & '', & ' o ASINH(3),', & '', & ' o ASINH(3),', & '', & ' o ATANH(3)', & '', & ' o ATANH(3),', & '', & 'RESOURCES', & ' o Wikipedia:sine and cosine', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 sinpi(3fortran)', & ''] shortname="sinpi" call process() case('219','size') textblock=[character(len=256) :: & '', & 'size(3fortran) size(3fortran)', & '', & 'NAME', & ' SIZE(3) - [ARRAY:INQUIRY] Determine the size of an array or extent of one', & ' dimension', & '', & 'SYNOPSIS', & ' result = size(array [,dim] [,kind])', & '', & ' integer(kind=KIND) function size(array,dim,kind)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' integer(kind=**),intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o ARRAY is an assumed-rank array or array of any type and associated kind.', & '', & ' If ARRAY is a pointer it must be associated and allocatable arrays must', & ' be allocated.', & '', & ' o DIM is an integer scalar', & '', & ' o KIND is a scalar integer constant expression.', & '', & ' o the result is an integer scalar of kind KIND. If KIND is absent a integer', & ' of default kind is returned.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' SIZE(3) returns the total number of elements in an array, or if DIM is', & ' specified returns the number of elements along that dimension.', & '', & ' SIZE(3) determines the extent of ARRAY along a specified dimension DIM, or', & ' the total number of elements in ARRAY if DIM is absent.', & '', & 'OPTIONS', & ' o ARRAY : the array to measure the number of elements of. If ARRAY is an', & ' assumed-size array, DIM shall be present with a value less than the rank', & ' of ARRAY.', & '', & ' o DIM : a value shall be in the range from 1 to n, where n equals the rank', & ' of ARRAY.', & '', & ' If not present the total number of elements of the entire array are', & ' returned.', & '', & ' o KIND : An integer initialization expression indicating the kind parameter', & ' of the result.', & '', & ' If absent the kind type parameter of the returned value is that of', & ' default integer type.', & '', & ' The KIND must allow for the magnitude returned by SIZE or results are', & ' undefined.', & '', & ' If KIND is absent, the return value is of default integer kind.', & '', & 'RESULT', & ' If DIM is not present ARRAY is assumed-rank, the result has a value equal to', & ' PRODUCT(SHAPE(ARRAY,KIND)). Otherwise, the result has a value equal to the', & ' total number of elements of ARRAY.', & '', & ' If DIM is present the number of elements along that dimension are returned,', & ' except that if ARRAY is assumed-rank and associated with an assumed-size', & ' array and DIM is present with a value equal to the rank of ARRAY, the value', & ' is -1.', & '', & ' NOTE1', & '', & ' If ARRAY is assumed-rank and has rank zero, DIM cannot be present since it', & ' cannot satisfy the requirement', & '', & ' 1 <= DIM <= 0.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_size', & ' implicit none', & ' integer :: arr(0:2,-5:5)', & ' write(*,*)''SIZE of simple two-dimensional array''', & ' write(*,*)''SIZE(arr) :total count of elements:'',size(arr)', & ' write(*,*)''SIZE(arr,DIM=1) :number of rows :'',size(arr,dim=1)', & ' write(*,*)''SIZE(arr,DIM=2) :number of columns :'',size(arr,dim=2)', & '', & ' ! pass the same array to a procedure that passes the value two', & ' ! different ways', & ' call interfaced(arr,arr)', & ' contains', & '', & ' subroutine interfaced(arr1,arr2)', & ' ! notice the difference in the array specification', & ' ! for arr1 and arr2.', & ' integer,intent(in) :: arr1(:,:)', & ' integer,intent(in) :: arr2(2,*)', & ' !', & ' write(*,*)''interfaced assumed-shape array''', & ' write(*,*)''SIZE(arr1) :'',size(arr1)', & ' write(*,*)''SIZE(arr1,DIM=1) :'',size(arr1,dim=1)', & ' write(*,*)''SIZE(arr1,DIM=2) :'',size(arr1,dim=2)', & '', & ' ! write(*,*)''SIZE(arr2) :'',size(arr2)', & ' write(*,*)''SIZE(arr2,DIM=1) :'',size(arr2,dim=1)', & ' !', & ' ! CANNOT DETERMINE SIZE OF ASSUMED SIZE ARRAY LAST DIMENSION', & ' ! write(*,*)''SIZE(arr2,DIM=2) :'',size(arr2,dim=2)', & '', & ' end subroutine interfaced', & '', & ' end program demo_size', & '', & ' Results:', & '', & ' > SIZE of simple two-dimensional array', & ' > SIZE(arr) :total count of elements: 33', & ' > SIZE(arr,DIM=1) :number of rows : 3', & ' > SIZE(arr,DIM=2) :number of columns : 11', & ' > interfaced assumed-shape array', & ' > SIZE(arr1) : 33', & ' > SIZE(arr1,DIM=1) : 3', & ' > SIZE(arr1,DIM=2) : 11', & ' > SIZE(arr2,DIM=1) : 2', & '', & 'STANDARD', & ' Fortran 95 , with KIND argument - Fortran 2003', & '', & 'SEE ALSO', & ' Array inquiry:', & '', & ' o SIZE(3) - Determine the size of an array', & '', & ' o RANK(3) - Rank of a data object', & '', & ' o SHAPE(3) - Determine the shape of an array', & '', & ' o UBOUND(3) - Upper dimension bounds of an array', & '', & ' o LBOUND(3) - Lower dimension bounds of an array', & '', & ' State Inquiry:', & '', & ' o ALLOCATED(3) - Status of an allocatable entity', & '', & ' o IS_CONTIGUOUS(3) - Test if object is contiguous', & '', & ' Kind Inquiry:', & '', & ' o KIND(3) - Kind of an entity', & '', & ' Bit Inquiry:', & '', & ' o STORAGE_SIZE(3) - Storage size in bits', & '', & ' o BIT_SIZE(3) - Bit size inquiry function', & '', & ' o BTEST(3) - Tests a bit of an integer value.', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 size(3fortran)', & ''] shortname="size" call process() case('220','spacing') textblock=[character(len=256) :: & '', & 'spacing(3fortran) spacing(3fortran)', & '', & 'NAME', & ' SPACING(3) - [MODEL_COMPONENTS] Smallest distance between two numbers of a', & ' given type', & '', & 'SYNOPSIS', & ' result = spacing(x)', & '', & ' elemental real(kind=KIND) function spacing(x)', & '', & ' real(kind=KIND), intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X is type real of any valid kind', & '', & ' o The result is of the same type as the input argument X.', & '', & 'DESCRIPTION', & ' SPACING(3) determines the distance between the argument X and the nearest', & ' adjacent number of the same type.', & '', & 'OPTIONS', & ' o X : Shall be of type real.', & '', & 'RESULT', & ' If X does not have the value zero and is not an IEEE infinity or NaN, the', & ' result has the value nearest to X for values of the same type and kind', & ' assuming the value is representable.', & '', & ' Otherwise, the value is the same as TINY(X). + zero produces TINY(X) + IEEE', & ' Infinity produces an IEEE Nan + if an IEEE NaN, that NaN is returned', & '', & ' If there are two extended model values equally near to X, the value of', & ' greater absolute value is taken.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_spacing', & ' implicit none', & ' integer, parameter :: sgl = selected_real_kind(p=6, r=37)', & ' integer, parameter :: dbl = selected_real_kind(p=13, r=200)', & '', & ' write(*,*) spacing(1.0_sgl)', & ' write(*,*) nearest(1.0_sgl,+1.0),nearest(1.0_sgl,+1.0)-1.0', & '', & ' write(*,*) spacing(1.0_dbl)', & ' end program demo_spacing', & '', & ' Results:', & '', & ' Typical values ...', & '', & ' > 1.1920929E-07', & ' > 1.000000 1.1920929E-07', & ' > 0.9999999 -5.9604645E-08', & ' > 2.220446049250313E-016', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3),', & ' SCALE(3), SET_EXPONENT(3), TINY(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 spacing(3fortran)', & ''] shortname="spacing" call process() case('221','split') textblock=[character(len=256) :: & '', & 'split(3fortran) split(3fortran)', & '', & 'NAME', & ' SPLIT(3) - [CHARACTER:PARSE] Parse a string into tokens, one at a time', & '', & 'SYNOPSIS', & ' call split (string, set, pos [, back])', & '', & ' character(kind=KIND),intent(in) :: string', & ' character(len=*,kind=KIND),intent(in) :: set', & ' integer,intent(inout) :: pos', & ' logical,intent(in),optional :: back', & '', & 'CHARACTERISTICS', & ' o STRING is a scalar character variable', & '', & ' o SET is a scalar character variable of the same kind as STRING.', & '', & 'DESCRIPTION', & ' Find the extent of consecutive tokens in a string. Given a string and a', & ' position to start looking for a token return the position of the end of the', & ' token. A set of separator characters may be specified as well as the', & ' direction of parsing.', & '', & ' Typically consecutive calls are used to parse a string into a set of tokens', & ' by stepping through the start and end positions of each token.', & '', & 'OPTIONS', & ' o STRING : The string to search for tokens in.', & '', & ' o SET : Each character in SET is a token delimiter. A sequence of zero or', & ' more characters in STRING delimited by any token delimiter, or the', & ' beginning or end of STRING, comprise a token. Thus, two consecutive token', & ' delimiters in STRING, or a token delimiter in the first or last character', & ' of STRING, indicate a token with zero length.', & '', & ' o POS : On input, the position from which to start looking for the next', & ' separator from. This is typically the first character or the last', & ' returned value of POS if searching from left to right (ie. BACK is absent', & ' or .true.) or the last character or the last returned value of POS when', & ' searching from right to left (ie. when BACK is .false.).', & '', & ' If BACK is present with the value .true., the value of POS shall be in', & ' the range 0 < POS <= LEN(STRING)+1; otherwise it shall be in the range 0', & ' <= POS <= LEN(STRING).', & '', & ' So POS on input is typically an end of the string or the position of a', & ' separator, probably from a previous call to SPLIT but POS on input can be', & ' any position in the range 1 <= POS <= LEN(STRING). If POS points to a', & ' non-separator character in the string the call is still valid but it will', & ' start searching from the specified position and that will result', & ' (somewhat obviously) in the string from POS on input to the returned POS', & ' being a partial token.', & '', & ' o BACK : If BACK is absent or is present with the value .false., POS is', & ' assigned the position of the leftmost token delimiter in STRING whose', & ' position is greater than POS, or if there is no such character, it is', & ' assigned a value one greater than the length of STRING. This identifies a', & ' token with starting position one greater than the value of POS on', & ' invocation, and ending position one less than the value of POS on return.', & '', & ' If BACK is present with the value .true., POS is assigned the position of', & ' the rightmost token delimiter in STRING whose position is less than POS,', & ' or if there is no such character, it is assigned the value zero. This', & ' identifies a token with ending position one less than the value of POS on', & ' invocation, and starting position one greater than the value of POS on', & ' return.', & '', & 'EXAMPLE', & ' Sample program:', & '', & ' program demo_split', & ' !use m_strings, only: split=>split2020', & ' implicit none', & ' character (len=:), allocatable :: input', & ' integer :: position, istart, iend', & ' input = "one,last example,,x,, ,,"', & ' position = 0', & ' ! write a number line', & ' write(*,''(t3,a)'') repeat(''1234567890'',6)', & ' ! display the input line', & ' write(*,''(t3,a)'') input', & ' ! step through the input string locating the bounds of the', & ' ! next token and printing it', & ' do while (position < len(input))', & ' istart = position + 1', & ' call split (input, set='', '', pos=position)', & ' iend = position - 1', & ' if(iend >= istart)then', & ' print ''(t3,a,1x,i0,1x,i0)'', input (istart:iend),istart,iend', & ' else', & ' ! maybe ignore null fields, maybe not ...', & ' write(*,''(t3,*(g0))'')''null between '',iend,'' and '',istart', & ' endif', & ' end do', & ' end program demo_split', & '', & ' Results:', & '', & ' > 123456789012345678901234567890123456789012345678901234567890', & ' > one,last example,,x,, ,,', & ' > one 1 3', & ' > last 5 8', & ' > example 10 16', & ' > null between 17 and 18', & ' > x 19 19', & ' > null between 20 and 21', & ' > null between 21 and 22', & ' > null between 22 and 23', & ' > null between 23 and 24', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' o TOKENIZE(3) - Parse a string into tokens', & '', & ' o INDEX(3) - Position of a substring within a string', & '', & ' o SCAN(3) - Scan a string for the presence of a set of characters', & '', & ' o VERIFY(3) - Position of a character in a string of characters that does', & ' not appear in a given set of characters.', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 split(3fortran)', & ''] shortname="split" call process() case('222','spread') textblock=[character(len=256) :: & '', & 'spread(3fortran) spread(3fortran)', & '', & 'NAME', & ' SPREAD(3) - [ARRAY:CONSTRUCTION] Add a dimension and replicate data', & '', & 'SYNOPSIS', & ' result = spread(source, dim, ncopies)', & '', & ' TYPE(kind=KIND) function spread(source, dim, ncopies)', & '', & ' TYPE(kind=KIND) :: source(..)', & ' integer(kind=**),intent(in) :: dim', & ' integer(kind=**),intent(in) :: ncopies', & '', & 'CHARACTERISTICS', & ' o SOURCE is a scalar or array of any type and a rank less than fifteen.', & '', & ' o DIM is an integer scalar', & '', & ' o NCOPIES is an integer scalar', & '', & 'DESCRIPTION', & ' SPREAD(3) replicates a SOURCE array along a specified dimension DIM. The', & ' copy is repeated NCOPIES times.', & '', & ' So to add additional rows to a matrix DIM=1 would be used, but to add', & ' additional rows DIM=2 would be used, for example.', & '', & ' If SOURCE is scalar, the size of the resulting vector is NCOPIES and each', & ' element of the result has a value equal to SOURCE.', & '', & 'OPTIONS', & ' o SOURCE : the input data to duplicate', & '', & ' o DIM : The additional dimension value in the range from 1 to N+1, where N', & ' equals the rank of SOURCE.', & '', & ' o NCOPIES : the number of copies of the original data to generate', & '', & 'RESULT', & ' The result is an array of the same type as SOURCE and has rank N+1 where N', & ' equals the rank of SOURCE.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_spread', & ' implicit none', & '', & ' integer a1(4,3), a2(3,4), v(4), s', & '', & ' write(*,''(a)'' ) &', & ' ''TEST SPREAD(3) '', &', & ' '' SPREAD(3) is a FORTRAN90 function which replicates'', &', & ' '' an array by adding a dimension. '', &', & ' '' ''', & '', & ' s = 99', & ' call printi(''suppose we have a scalar S'',s)', & '', & ' write(*,*) ''to add a new dimension (1) of extent 4 call''', & ' call printi(''spread( s, dim=1, ncopies=4 )'',spread ( s, 1, 4 ))', & '', & ' v = [ 1, 2, 3, 4 ]', & ' call printi('' first we will set V to'',v)', & '', & ' write(*,''(a)'')'' and then do "spread ( v, dim=2, ncopies=3 )"''', & ' a1 = spread ( v, dim=2, ncopies=3 )', & ' call printi(''uses v as a column and makes 3 columns'',a1)', & '', & ' a2 = spread ( v, 1, 3 )', & ' call printi('' spread(v,1,3) uses v as a row and makes 3 rows'',a2)', & '', & ' contains', & ' ! CONVENIENCE ROUTINE; NOT DIRECTLY CONNECTED TO SPREAD(3)', & ' subroutine printi(title,a)', & ' use, intrinsic :: iso_fortran_env, only : stderr=>ERROR_UNIT,&', & ' & stdin=>INPUT_UNIT, stdout=>OUTPUT_UNIT', & ' implicit none', & '', & ' !@(#) print small 2d integer scalar, vector, matrix in row-column format', & '', & ' character(len=*),parameter :: all=''(" ",*(g0,1x))''', & ' character(len=*),intent(in) :: title', & ' character(len=20) :: row', & ' integer,intent(in) :: a(..)', & ' integer :: i', & '', & ' write(*,all,advance=''no'')trim(title)', & ' ! select rank of input', & ' select rank(a)', & ' rank (0); write(*,''(a)'')'' (a scalar)''', & ' write(*,''(" > [ ",i0," ]")'')a', & ' rank (1); write(*,''(a)'')'' (a vector)''', & ' ! find how many characters to use for integers', & ' write(row,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(a))))))+2', & ' ! use this format to write a row', & ' row=''(" > [",*(i''//trim(row)//'':,","))''', & ' do i=1,size(a)', & ' write(*,fmt=row,advance=''no'')a(i)', & ' write(*,''(" ]")'')', & ' enddo', & ' rank (2); write(*,''(a)'')'' (a matrix) ''', & ' ! find how many characters to use for integers', & ' write(row,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(a))))))+2', & ' ! use this format to write a row', & ' row=''(" > [",*(i''//trim(row)//'':,","))''', & ' do i=1,size(a,dim=1)', & ' write(*,fmt=row,advance=''no'')a(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & ' rank default', & ' write(stderr,*)''*printi* did not expect rank='', rank(a), &', & ' & ''shape='', shape(a),''size='',size(a)', & ' stop ''*printi* unexpected rank''', & ' end select', & ' write(*,all) ''>shape='',shape(a),'',rank='',rank(a),'',size='',size(a)', & ' write(*,*)', & '', & ' end subroutine printi', & '', & ' end program demo_spread', & '', & ' Results:', & '', & ' > TEST SPREAD(3)', & ' > SPREAD(3) is a FORTRAN90 function which replicates', & ' > an array by adding a dimension.', & ' >', & ' > suppose we have a scalar S (a scalar)', & ' > > [ 99 ]', & ' > >shape= ,rank= 0 ,size= 1', & ' >', & ' > to add a new dimension (1) of extent 4 call', & ' > spread( s, dim=1, ncopies=4 ) (a vector)', & ' > > [ 99 ]', & ' > > [ 99 ]', & ' > > [ 99 ]', & ' > > [ 0 ]', & ' > >shape= 4 ,rank= 1 ,size= 4', & ' >', & ' > first we will set V to (a vector)', & ' > > [ 1 ]', & ' > > [ 2 ]', & ' > > [ 3 ]', & ' > > [ 4 ]', & ' > >shape= 4 ,rank= 1 ,size= 4', & ' >', & ' > and then do "spread ( v, dim=2, ncopies=3 )"', & ' > uses v as a column and makes 3 columns (a matrix)', & ' > > [ 1, 1, 1 ]', & ' > > [ 2, 2, 2 ]', & ' > > [ 3, 3, 3 ]', & ' > > [ 4, 4, 4 ]', & ' > >shape= 4 3 ,rank= 2 ,size= 12', & ' >', & ' > spread(v,1,3) uses v as a row and makes 3 rows (a matrix)', & ' > > [ 1, 2, 3, 4 ]', & ' > > [ 1, 2, 3, 4 ]', & ' > > [ 1, 2, 3, 4 ]', & ' > >shape= 3 4 ,rank= 2 ,size= 12', & ' >', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' MERGE(3), PACK(3), UNPACK(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 spread(3fortran)', & ''] shortname="spread" call process() case('223','sqrt') textblock=[character(len=256) :: & '', & 'sqrt(3fortran) sqrt(3fortran)', & '', & 'NAME', & ' SQRT(3) - [MATHEMATICS] Square-root function', & '', & 'SYNOPSIS', & ' result = sqrt(x)', & '', & ' elemental TYPE(kind=KIND) function sqrt(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o TYPE may be real or complex.', & '', & ' o KIND may be any kind valid for the declared type.', & '', & ' o the result has the same characteristics as X.', & '', & 'DESCRIPTION', & ' SQRT(3) computes the principal square root of X.', & '', & ' The number whose square root is being considered is known as the radicand.', & '', & ' In mathematics, a square root of a radicand X is a number Y such that Y*Y =', & ' X.', & '', & ' Every nonnegative radicand X has two square roots of the same unique', & ' magnitude, one positive and one negative. The nonnegative square root is', & ' called the principal square root.', & '', & ' The principal square root of 9 is 3, for example, even though (-3)*(-3) is', & ' also 9.', & '', & ' Square roots of negative numbers are a special case of complex numbers,', & ' where with COMPLEX input the components of the radicand need not be positive', & ' in order to have a valid square root.', & '', & 'OPTIONS', & ' o X : The radicand to find the principal square root of. If X is real its', & ' value must be greater than or equal to zero.', & '', & 'RESULT', & ' The principal square root of X is returned.', & '', & ' For a complex result the real part is greater than or equal to zero.', & '', & ' When the real part of the result is zero, the imaginary part has the same', & ' sign as the imaginary part of X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_sqrt', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x, x2', & ' complex :: z, z2', & '', & ' ! basics', & ' x = 2.0_real64', & ' ! complex', & ' z = (1.0, 2.0)', & ' write(*,*)''input values '',x,z', & '', & ' x2 = sqrt(x)', & ' z2 = sqrt(z)', & ' write(*,*)''output values '',x2,z2', & '', & ' ! elemental', & ' write(*,*)''elemental'',sqrt([64.0,121.0,30.0])', & '', & ' ! alternatives', & ' x2 = x**0.5', & ' z2 = z**0.5', & ' write(*,*)''alternatively'',x2,z2', & '', & ' end program demo_sqrt', & '', & ' Results:', & '', & ' > input values 2.00000000000000 (1.000000,2.000000)', & ' > output values 1.41421356237310 (1.272020,0.7861513)', & ' > elemental 8.000000 11.00000 5.477226', & ' > alternatively 1.41421356237310 (1.272020,0.7861513)', & '', & 'STANDARD', & ' FORTRAN 77', & '', & 'SEE ALSO', & ' EXP(3), LOG(3), LOG10(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 sqrt(3fortran)', & ''] shortname="sqrt" call process() case('224','stop') textblock=[character(len=256) :: & '', & 'stop(7fortran) stop(7fortran)', & '', & 'NAME', & ' STOP(7) - [STATEMENT] initiates termination of execution', & '', & 'SYNOPSIS', & ' stop [ stop-code ]', & '', & ' error stop [ stop-code ]', & '', & 'CHARACTERISTICS', & ' o STOP-CODE is a constant scalar _character_or integer expression, of', & ' default kind.', & '', & 'DESCRIPTION', & ' A STOP statement will cause the program to terminate normally.', & '', & ' It may provide additional information in the form of output or a system', & ' status code, depending on the system.', & '', & ' Any messages generated appear on the ERROR_UNIT file, as identified in the', & ' intrinsic module ISO_FORTRAN_ENV. This unit is often referred to as', & ' "stderr".', & '', & ' It is recommended that systems write the value of the stop code whether', & ' numeric or a string.', & '', & ' Note that although STOP causes a "normal" termination, system status codes', & ' or "exit codes" are often used for error processing in many scripting', & ' languages. This code may be detectable by EXECUTE_SYSTEM_COMMAND(3f).', & '', & ' Execution of an ERROR STOP statement initiates error termination of an', & ' execution, which on several systems includes the output from a traceback.', & '', & ' So when an image is terminated by a STOP or ERROR STOP statement, its stop', & ' code, if any, is made available in a processor-dependent manner.', & '', & ' If any exception is signaling on a stopped image, the processor issues a', & ' warning indicating which exceptions are signaling;', & '', & ' When normal termination occurs on more than one image, it is expected that a', & ' processor-dependent summary of any stop codes and signaling exceptions will', & ' be made available.', & '', & ' If an integer STOP-CODE is used as the process exit status, the processor', & ' might be able to interpret only values within a limited range, OR only a', & ' limited portion of the integer value (for example, only the least-', & ' significant 8 bits).', & '', & ' If the STOP-CODE is of type character or does not appear, OR if an END', & ' PROGRAM statement is executed, it is recommended that the value zero be', & ' supplied as the process exit status, if the processor supports that concept.', & '', & 'EXAMPLES', & ' Sample:', & '', & ' program demo_stop', & ' ! select which STOP call to make from command line', & ' use, intrinsic :: iso_fortran_env, only : stderr=>ERROR_UNIT', & ' implicit none', & ' integer :: istat, argument_length, stopcode', & ' character(len=:),allocatable :: which, message', & ' ! allocate string array big enough to hold command line', & ' call get_command_argument(number=1,length=argument_length)', & ' ! argument strings and related information', & ' if(allocated(which))deallocate(which)', & ' allocate(character(len=argument_length) :: which)', & ' call get_command_argument(1, which,status=istat)', & ' if(istat.ne.0)which=''''', & ' select case(which)', & ' ! normal terminations:', & ' ! A STOP with no non-zero numeric parameter is a normal', & ' ! termination and generally returns a zero status value if the', & ' ! system supports return statuses', & ' case(''basic''); stop ! usually displays nothing', & ' case(''zero''); stop 0 ! sometimes displays "STOP 0" or "0"', & ' case(''text''); stop ''That is all, folks!''', & ' !', & ' ! All other stops are generally used to indicate an error or', & ' ! special exit type', & ' case(''nonzero''); stop 10', & ' case(''variable''); stopcode=11; stop stopcode', & ' case(''expression''); stopcode=11; stop 110/stopcode', & ' case(''string''); message=''oops''; stop ''ERROR:[''//message//'']''', & ' ! Error terminations:', & ' ! ERROR STOP is always an error stop, even without a stop-code', & ' ! ERROR STOP often displays a traceback but that is not required', & ' case(''error'')', & ' error stop', & ' case(''errornum'')', & ' stopcode=10', & ' error stop stopcode+3', & ' case(''errorstring'')', & ' message=''That is all, folks!''', & ' error stop ''ERROR:''//message', & ' case default', & ' write(*,''(a)'')''enter a stop type:'', &', & ' & ''{basic, text, zero, nonzero, variable, expression}'', &', & ' & ''{error, errornum, errorstring}''', & ' write(*,*)''try again ...''', & ' end select', & ' end program demo_stop', & '', & 'STANDARD', & ' FORTRAN 77, ERROR STOP introduced in Fortran f2018', & '', & ' Fortran statement descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 stop(7fortran)', & ''] shortname="stop" call process() case('225','storage_size') textblock=[character(len=256) :: & '', & 'storage_size(3fortran) storage_size(3fortran)', & '', & 'NAME', & ' STORAGE_SIZE(3) - [BIT:INQUIRY] Storage size in bits', & '', & 'SYNOPSIS', & ' result = storage_size(a [,KIND] )', & '', & ' integer(kind=KIND) storage_size(a,KIND)', & '', & ' type(TYPE(kind=**)) :: a', & ' integer,intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o A may be of any type and kind. If it is polymorphic it shall not be an', & ' undefined pointer. If it is unlimited polymorphic or has any deferred', & ' type parameters, it shall not be an unallocated allocatable variable or a', & ' disassociated or undefined pointer.', & '', & ' o The kind type parameter of the returned value is that specified by the', & ' value of KIND; otherwise, the kind type parameter is that of default', & ' integer type.', & '', & ' o The result is an integer scalar of default kind unless KIND is specified,', & ' in which case it has the kind specified by KIND.', & '', & 'DESCRIPTION', & ' STORAGE_SIZE(3) returns the storage size of argument A in bits.', & '', & 'OPTIONS', & ' o A : The entity to determine the storage size of', & '', & ' o KIND : a scalar integer constant expression that defines the kind of the', & ' output value.', & '', & 'RESULT', & ' The result value is the size expressed in bits for an element of an array', & ' that has the dynamic type and type parameters of A.', & '', & ' If the type and type parameters are such that storage association applies,', & ' the result is consistent with the named constants defined in the intrinsic', & ' module ISO_FORTRAN_ENV.', & '', & ' NOTE1', & '', & ' An array element might take "type" more bits to store than an isolated', & ' scalar, since any hardware-imposed alignment requirements for array elements', & ' might not apply to a simple scalar variable.', & '', & ' NOTE2', & '', & ' This is intended to be the size in memory that an object takes when it is', & ' stored; this might differ from the size it takes during expression handling', & ' (which might be the native register size) or when stored in a file. If an', & ' object is never stored in memory but only in a register, this function', & ' nonetheless returns the size it would take if it were stored in memory.', & '', & 'EXAMPLES', & ' Sample program', & '', & ' program demo_storage_size', & ' implicit none', & '', & ' ! a default real, integer, and logical are the same storage size', & ' write(*,*)''size of integer '',storage_size(0)', & ' write(*,*)''size of real '',storage_size(0.0)', & ' write(*,*)''size of logical '',storage_size(.true.)', & ' write(*,*)''size of complex '',storage_size((0.0,0.0))', & '', & ' ! note the size of an element of the array, not the storage size of', & ' ! the entire array is returned for array arguments', & ' write(*,*)''size of integer array '',storage_size([0,1,2,3,4,5,6,7,8,9])', & '', & ' end program demo_storage_size', & '', & ' Results:', & '', & ' > size of integer 32', & ' > size of real 32', & ' > size of logical 32', & ' > size of complex 64', & ' > size of integer array 32', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' C_SIZEOF(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 storage_size(3fortran)', & ''] shortname="storage_size" call process() case('226','sum') textblock=[character(len=256) :: & '', & 'sum(3fortran) sum(3fortran)', & '', & 'NAME', & ' SUM(3) - [ARRAY:REDUCTION] Sum the elements of an array', & '', & 'SYNOPSIS', & ' result = sum(array [,dim[,mask]] | [mask] )', & '', & ' TYPE(kind=KIND) function sum(array, dim, mask)', & '', & ' TYPE(kind=KIND),intent(in) :: array(..)', & ' integer(kind=**),intent(in),optional :: dim', & ' logical(kind=**),intent(in),optional :: mask(..)', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o ARRAY may be of any numeric type - integer, real or complex.', & '', & ' o DIM is an integer', & '', & ' o MASK is logical and conformable with ARRAY.', & '', & ' o The result is of the same type and kind as ARRAY. It is scalar if DIM is', & ' not present or ARRAY is a vector, else it is an array.', & '', & 'DESCRIPTION', & ' SUM(3) adds the elements of ARRAY.', & '', & ' When only ARRAY is specified all elements are summed, but groups of sums may', & ' be returned along the dimension specified by DIM and/or elements to add may', & ' be selected by a logical mask.', & '', & ' No method is designated for how the sum is conducted, so whether or not', & ' accumulated error is compensated for is processor-dependent.', & '', & 'OPTIONS', & ' o ARRAY : an array containing the elements to add', & '', & ' o DIM : a value in the range from 1 to n, where n equals the rank (the', & ' number of dimensions) of ARRAY. DIM designates the dimension along which', & ' to create sums. When absent a scalar sum of the elements optionally', & ' selected by MASK is returned.', & '', & ' o MASK : an array of the same shape as ARRAY that designates which elements', & ' to add. If absent all elements are used in the sum(s).', & '', & 'RESULT', & ' If DIM is absent, a scalar with the sum of all selected elements in ARRAY is', & ' returned. Otherwise, an array of rank n-1, where n equals the rank of ARRAY,', & ' and a shape similar to that of ARRAY with dimension DIM dropped is returned.', & ' Since a vector has a rank of one, the result is a scalar (if n==1, n-1 is', & ' zero; and a rank of zero means a scalar).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_sum', & ' implicit none', & ' integer :: vector(5) , matrix(3,4), box(5,6,7)', & '', & ' vector = [ 1, 2, -3, 4, 5 ]', & '', & ' matrix(1,:)=[ -1, 2, -3, 4 ]', & ' matrix(2,:)=[ 10, -20, 30, -40 ]', & ' matrix(3,:)=[ 100, 200, -300, 400 ]', & '', & ' box=11', & '', & ' ! basics', & ' print *, ''sum all elements:'',sum(vector)', & ' print *, ''real :'',sum([11.0,-5.0,20.0])', & ' print *, ''complex :'',sum([(1.1,-3.3),(4.0,5.0),(8.0,-6.0)])', & ' ! with MASK option', & ' print *, ''sum odd elements:'',sum(vector, mask=mod(vector, 2)==1)', & ' print *, ''sum positive values:'', sum(vector, mask=vector>0)', & '', & ' call printi(''the input array'', matrix )', & ' call printi(''sum of all elements in matrix'', sum(matrix) )', & ' call printi(''sum of positive elements'', sum(matrix,matrix>=0) )', & ' ! along dimensions', & ' call printi(''sum along rows'', sum(matrix,dim=1) )', & ' call printi(''sum along columns'', sum(matrix,dim=2) )', & ' call printi(''sum of a vector is always a scalar'', sum(vector,dim=1) )', & ' call printi(''sum of a volume by row'', sum(box,dim=1) )', & ' call printi(''sum of a volume by column'', sum(box,dim=2) )', & ' call printi(''sum of a volume by depth'', sum(box,dim=3) )', & '', & ' contains', & ' ! CONVENIENCE ROUTINE; NOT DIRECTLY CONNECTED TO SPREAD(3)', & ' subroutine printi(title,a)', & ' use, intrinsic :: iso_fortran_env, only : stderr=>ERROR_UNIT,&', & ' & stdin=>INPUT_UNIT, stdout=>OUTPUT_UNIT', & ' implicit none', & '', & ' !@(#) print small 2d integer scalar, vector, matrix in row-column format', & '', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: a(..)', & '', & ' character(len=*),parameter :: all=''(" ",*(g0,1x))''', & ' character(len=20) :: row', & ' integer,allocatable :: b(:,:)', & ' integer :: i', & ' write(*,all,advance=''no'')trim(title)', & ' ! copy everything to a matrix to keep code simple', & ' select rank(a)', & ' rank (0); write(*,''(a)'')'' (a scalar)''; b=reshape([a],[1,1])', & ' rank (1); write(*,''(a)'')'' (a vector)''; b=reshape(a,[size(a),1])', & ' rank (2); write(*,''(a)'')'' (a matrix)''; b=a', & ' rank default; stop ''*printi* unexpected rank''', & ' end select', & ' ! find how many characters to use for integers', & ' write(row,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(b))))))+2', & ' ! use this format to write a row', & ' row=''(" > [",*(i''//trim(row)//'':,","))''', & ' do i=1,size(b,dim=1)', & ' write(*,fmt=row,advance=''no'')b(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & ' write(*,all) ''>shape='',shape(a),'',rank='',rank(a),'',size='',size(a)', & ' write(*,*)', & ' end subroutine printi', & ' end program demo_sum', & '', & ' Results:', & '', & ' > sum all elements: 9', & ' > real : 26.0000000', & ' > complex : (13.1000004,-4.30000019)', & ' > sum odd elements: 6', & ' > sum positive values: 12', & ' > the input array (a matrix)', & ' > > [ -1, 2, -3, 4 ]', & ' > > [ 10, -20, 30, -40 ]', & ' > > [ 100, 200, -300, 400 ]', & ' > >shape= 3 4 ,rank= 2 ,size= 12', & ' >', & ' > sum of all elements in matrix (a scalar)', & ' > > [ 382 ]', & ' > >shape= ,rank= 0 ,size= 1', & ' >', & ' > sum of positive elements (a scalar)', & ' > > [ 746 ]', & ' > >shape= ,rank= 0 ,size= 1', & ' >', & ' > sum along rows (a vector)', & ' > > [ 109 ]', & ' > > [ 182 ]', & ' > > [ -273 ]', & ' > > [ 364 ]', & ' > >shape= 4 ,rank= 1 ,size= 4', & ' >', & ' > sum along columns (a vector)', & ' > > [ 2 ]', & ' > > [ -20 ]', & ' > > [ 400 ]', & ' > >shape= 3 ,rank= 1 ,size= 3', & ' >', & ' > sum of a vector is always a scalar (a scalar)', & ' > > [ 9 ]', & ' > >shape= ,rank= 0 ,size= 1', & ' >', & ' > sum of a volume by row (a matrix)', & ' > > [ 55, 55, 55, 55, 55, 55, 55 ]', & ' > > [ 55, 55, 55, 55, 55, 55, 55 ]', & ' > > [ 55, 55, 55, 55, 55, 55, 55 ]', & ' > > [ 55, 55, 55, 55, 55, 55, 55 ]', & ' > > [ 55, 55, 55, 55, 55, 55, 55 ]', & ' > > [ 55, 55, 55, 55, 55, 55, 113 ]', & ' > >shape= 6 7 ,rank= 2 ,size= 42', & ' >', & ' > sum of a volume by column (a matrix)', & ' > > [ 66, 66, 66, 66, 66, 66, 66 ]', & ' > > [ 66, 66, 66, 66, 66, 66, 66 ]', & ' > > [ 66, 66, 66, 66, 66, 66, 66 ]', & ' > > [ 66, 66, 66, 66, 66, 66, 66 ]', & ' > > [ 66, 66, 66, 66, 66, 66,**** ]', & ' > >shape= 5 7 ,rank= 2 ,size= 35', & ' >', & ' > sum of a volume by depth (a matrix)', & ' > > [ 77, 77, 77, 77, 77, 77 ]', & ' > > [ 77, 77, 77, 77, 77, 77 ]', & ' > > [ 77, 77, 77, 77, 77, 77 ]', & ' > > [ 77, 77, 77, 77, 77, 77 ]', & ' > > [ 77, 77, 77, 77, 77,4193 ]', & ' > >shape= 5 6 ,rank= 2 ,size= 30', & ' >', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o ALL(3) - Determines if all the values are true', & '', & ' o ANY(3) - Determines if any of the values in the logical array are true.', & '', & ' o COUNT(3) - Count true values in an array', & '', & ' o MAXVAL(3) - Determines the maximum value in an array', & '', & ' o MINVAL(3) - Minimum value of an array', & '', & ' o PRODUCT(3) - Product of array elements', & '', & ' o MERGE(3) - Merge variables', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 sum(3fortran)', & ''] shortname="sum" call process() case('227','system_clock') textblock=[character(len=256) :: & '', & 'system_clock(3fortran) system_clock(3fortran)', & '', & 'NAME', & ' SYSTEM_CLOCK(3) - [SYSTEM:TIME] Query system clock', & '', & 'SYNOPSIS', & ' call system_clock([count] [,count_rate] [,count_max] )', & '', & ' subroutine system_clock(count, count_rate, count_max)', & '', & ' integer(kind=**),intent(out),optional :: count', & ' type(TYPE(kind=**)),intent(out),optional :: count_rate', & ' integer(kind=**),intent(out),optional :: count_max', & '', & 'CHARACTERISTICS', & ' o COUNT is an integer scalar', & '', & ' o COUNT_RATE is an integer or real scalar', & '', & ' o COUNT_MAX is an integer scalar', & '', & 'DESCRIPTION', & ' SYSTEM_CLOCK(3) lets you measure durations of time with the precision of the', & ' smallest time increment generally available on a system by returning', & ' processor-dependent values based on the current value of the processor', & ' clock.', & '', & ' SYSTEM_CLOCK is typically used to measure short time intervals (system', & ' clocks may be 24-hour clocks or measure processor clock ticks since boot,', & ' for example). It is most often used for measuring or tracking the time spent', & ' in code blocks in lieu of using profiling tools.', & '', & ' COUNT_RATE and COUNT_MAX are assumed constant (even though CPU rates can', & ' vary on a single platform).', & '', & ' Whether an image has no clock, has a single clock of its own, or shares a', & ' clock with another image, is processor dependent.', & '', & ' If there is no clock, or querying the clock fails, COUNT is set to', & ' -HUGE(COUNT), and COUNT_RATE and COUNT_MAX are set to zero.', & '', & ' The accuracy of the measurements may depend on the kind of the arguments!', & '', & ' Timing-related procedures are obviously processor and system-dependent.', & ' More specific information may generally be found in compiler-specific', & ' documentation.', & '', & 'OPTIONS', & ' o COUNT : If there is no clock, the returned value for COUNT is the', & ' negative value -HUGE(COUNT).', & '', & ' Otherwise, the CLOCK value is incremented by one for each clock count', & ' until the value COUNT_MAX is reached and is then reset to zero at the', & ' next count. CLOCK therefore is a modulo value that lies in the range 0 TO', & ' COUNT_MAX.', & '', & ' o COUNT_RATE : is assigned a processor-dependent approximation to the', & ' number of processor clock counts per second, or zero if there is no', & ' clock. COUNT_RATE is system dependent and can vary depending on the kind', & ' of the arguments. Generally, a large real may generate a more precise', & ' interval.', & '', & ' o COUNT_MAX : is assigned the maximum value that COUNT can have, or zero if', & ' there is no clock.', & '', & 'EXAMPLES', & ' If the processor clock is a 24-hour clock that registers time at', & ' approximately 18.20648193 ticks per second, at 11:30 A.M. the reference', & '', & ' call system_clock (count = c, count_rate = r, count_max = m)', & '', & ' defines', & '', & ' C = (11*3600+30*60)*18.20648193 = 753748,', & ' R = 18.20648193, and', & ' M = 24*3600*18.20648193-1 = 1573039.', & '', & ' Sample program:', & '', & ' program demo_system_clock', & ' use, intrinsic :: iso_fortran_env, only: wp => real64, int32, int64', & ' implicit none', & ' character(len=*), parameter :: g = ''(1x,*(g0,1x))''', & '', & ' integer(kind=int64) :: count64, count_rate64, count_max64', & ' integer(kind=int64) :: start64, finish64', & '', & ' integer(kind=int32) :: count32, count_rate32, count_max32', & '', & ' real(kind=wp) :: time_read', & ' real(kind=wp) :: sum', & ' integer :: i', & '', & ' print g, ''accuracy may vary with argument type!''', & '', & ' print g, ''query all arguments''', & '', & ' call system_clock(count64, count_rate64, count_max64)', & ' print g, ''COUNT_MAX(64bit)='', count_max64', & ' print g, ''COUNT_RATE(64bit)='', count_rate64', & ' print g, ''CURRENT COUNT(64bit)='', count64', & '', & ' call system_clock(count32, count_rate32, count_max32)', & ' print g, ''COUNT_MAX(32bit)='', count_max32', & ' print g, ''COUNT_RATE(32bit)='', count_rate32', & ' print g, ''CURRENT COUNT(32bit)='', count32', & '', & ' print g, ''time some computation''', & ' call system_clock(start64)', & '', & ' ! some code to time', & ' sum = 0.0_wp', & ' do i = -0, huge(0) - 1', & ' sum = sum + sqrt(real(i))', & ' end do', & ' print g, ''SUM='', sum', & '', & ' call system_clock(finish64)', & '', & ' time_read = (finish64 - start64)/real(count_rate64, wp)', & ' write (*, ''(1x,a,1x,g0,1x,a)'') ''time : '', time_read, '' seconds''', & '', & ' end program demo_system_clock', & '', & ' Results:', & '', & ' > accuracy may vary with argument type!', & ' > query all arguments', & ' > COUNT_MAX(64bit)= 9223372036854775807', & ' > COUNT_RATE(64bit)= 1000000000', & ' > CURRENT COUNT(64bit)= 1105422387865806', & ' > COUNT_MAX(32bit)= 2147483647', & ' > COUNT_RATE(32bit)= 1000', & ' > CURRENT COUNT(32bit)= 1105422387', & ' > time some computation', & ' > SUM= 66344288183024.266', & ' > time : 6.1341038460000004 seconds', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DATE_AND_TIME(3), CPU_TIME(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 system_clock(3fortran)', & ''] shortname="system_clock" call process() case('228','tan') textblock=[character(len=256) :: & '', & 'tan(3fortran) tan(3fortran)', & '', & 'NAME', & ' TAN(3) - [MATHEMATICS:TRIGONOMETRIC] Tangent function', & '', & 'SYNOPSIS', & ' result = tan(x)', & '', & ' elemental TYPE(kind=KIND) function tan(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o the TYPE of X may be real or complex of any supported kind', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' TAN(3) computes the tangent of X.', & '', & 'OPTIONS', & ' o X : The angle in radians to compute the tangent of when the input is', & ' real. If X is of type complex, its real part is regarded as a value in', & ' radians.', & '', & 'RESULT', & ' The return value is the tangent of the value X.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_tan', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 0.165_real64', & ' write(*,*)x, tan(x)', & ' end program demo_tan', & '', & ' Results:', & '', & ' > 0.16500000000000001 0.16651386310913616', & '', & 'STANDARD', & ' FORTRAN 77 . For a complex argument, Fortran 2008 .', & '', & 'SEE ALSO', & ' ATAN(3), ATAN2(3), COS(3), SIN(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 tan(3fortran)', & ''] shortname="tan" call process() case('229','tand') textblock=[character(len=256) :: & '', & 'tand(3fortran) tand(3fortran)', & '', & 'NAME', & ' TAND(3) - [MATHEMATICS:TRIGONOMETRIC] Degree Tangent function', & '', & 'SYNOPSIS', & ' result = tand(x)', & '', & ' elemental real(kind=KIND) function tand(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o the TYPE of X is real of any supported kind', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' TAND(3) computes the degree tangent of X.', & '', & 'OPTIONS', & ' o X : The angle in degrees to compute the tangent of.', & '', & 'RESULT', & ' The return value is a processor-dependent approximation to the tangent of', & ' the value X where X is regarded as a value in degrees.', & '', & 'EXAMPLES', & ' tand(180.0) has the value 0.0 (approximately).', & '', & ' Sample program:', & '', & ' program demo_tand', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 0.5_real64', & ' write(*,*)x, tand(x)', & ' end program demo_tand', & '', & ' Result:', & '', & ' > 0.50000000000000000 8.7268677907587893E-003', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' ATAND(3), ATAN(3), ATAN2D(3), ATAN2(3), COSD(3), SIND(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 tand(3fortran)', & ''] shortname="tand" call process() case('230','tanh') textblock=[character(len=256) :: & '', & 'tanh(3fortran) tanh(3fortran)', & '', & 'NAME', & ' TANH(3) - [MATHEMATICS:TRIGONOMETRIC] Hyperbolic tangent function', & '', & 'SYNOPSIS', & ' result = tanh(x)', & '', & ' elemental TYPE(kind=KIND) function tanh(x)', & '', & ' TYPE(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o X may be real or complex and any associated kind supported by the', & ' processor.', & '', & ' o The returned value will be of the same type and kind as the argument.', & '', & 'DESCRIPTION', & ' TANH(3) computes the hyperbolic tangent of X.', & '', & 'OPTIONS', & ' o X : The value to compute the Hyperbolic tangent of.', & '', & 'RESULT', & ' Returns the hyperbolic tangent of X.', & '', & ' If X is complex, the imaginary part of the result is regarded as a radian', & ' value.', & '', & ' If X is real, the return value lies in the range', & '', & ' -1 <= tanh(x) <= 1.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_tanh', & ' use, intrinsic :: iso_fortran_env, only : real32, real64, real128', & ' implicit none', & ' real(kind=real64) :: x = 2.1_real64', & ' write(*,*)x, tanh(x)', & ' end program demo_tanh', & '', & ' Results:', & '', & ' > 2.1000000000000001 0.97045193661345386', & '', & 'STANDARD', & ' FORTRAN 77 , for a complex argument Fortran 2008', & '', & 'SEE ALSO', & ' ATANH(3)', & '', & 'RESOURCES', & ' o Wikipedia:hyperbolic functions', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 tanh(3fortran)', & ''] shortname="tanh" call process() case('231','tanpi') textblock=[character(len=256) :: & '', & 'tanpi(3fortran) tanpi(3fortran)', & '', & 'NAME', & ' TANPI(3) - [MATHEMATICS:TRIGONOMETRIC] Circular tangent function', & '', & 'SYNOPSIS', & ' result = tanpi(x)', & '', & ' elemental real(kind=KIND) function tanpi(x)', & '', & ' real(kind=KIND),intent(in) :: x', & '', & 'CHARACTERISTICS', & ' o the TYPE of X is real any supported kind', & '', & ' o The returned value will be of the same type and kind as the argument X.', & '', & 'DESCRIPTION', & ' TANPI(3) computes the Circular Tangent of X in half-revolutions.', & '', & ' The result has a value equal to a processor-dependent approximation to the', & ' tangent of X, which is regarded as a value in half-revolutions; thus, TANPI', & ' (X) is approximately equal to tan(X*PI).', & '', & 'OPTIONS', & ' o X : The angle in half-revolutions to compute the tangent of.', & '', & 'RESULT', & ' The return value is the tangent of the value X.', & '', & 'EXAMPLES', & ' Example: TAND(1.0) has the value 0.0 (approximately).', & '', & ' Sample program:', & '', & ' program demo_tanpi', & ' use, intrinsic :: iso_fortran_env, only : real64', & ' implicit none', & ' integer :: i', & ' real(kind=real64) :: x', & ' do i=0,8', & ' x=0.250000000d0*i', & ' write(*,101)x, tanpi(x), tanpi(x)*180.0d0', & ' enddo', & ' 101 format(g0,t23,g0,t50,g0)', & ' end program demo_tanpi', & '', & ' Results:', & '', & ' > .000000000000000 0.000000000000000 0.000000000000000', & ' > .2500000000000000 0.9999999999999999 180.0000000000000', & ' > .5000000000000000 0.1633123935319537E+17 0.2939623083575166E+19', & ' > .7500000000000000 -1.000000000000000 -180.0000000000000', & ' > 1.000000000000000 -0.1224646799147353E-15 -0.2204364238465236E-13', & ' > 1.250000000000000 0.9999999999999997 179.9999999999999', & ' > 1.500000000000000 5443746451065123. 0.9798743611917221E+18', & ' > 1.750000000000000 -1.000000000000000 -180.0000000000001', & ' > 2.000000000000000 -0.2449293598294706E-15 -0.4408728476930472E-13', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' ATAND(3), ATAND(3), ATAN2PI(3), ATAN2D(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 tanpi(3fortran)', & ''] shortname="tanpi" call process() case('232','this_image') textblock=[character(len=256) :: & '', & 'this_image(3fortran) this_image(3fortran)', & '', & 'NAME', & ' THIS_IMAGE(3) - [COLLECTIVE] Cosubscript index of this image', & '', & 'SYNOPSIS', & ' result = this_image() | = this_image(distance) | = this_image(coarray,dim)', & '', & ' integer function this_image( distance ,coarray, dim )', & '', & ' type(TYPE(kind=**)),optional :: coarray[*]', & ' integer,intent(in),optional :: distance', & ' integer,intent(in),optional :: dim', & '', & 'CHARACTERISTICS', & ' o a kind designated as ** may be any supported kind for the type', & '', & ' o COARRAY can be of any type. If DIM is present it is required.', & '', & ' o DISTANCE is not permitted together with COARRAY', & '', & ' o if DIM if present, coarray is required.', & '', & 'DESCRIPTION', & ' THIS_IMAGE(3) returns the cosubscript for this image.', & '', & 'OPTIONS', & ' o DISTANCE : Nonnegative scalar integer (not permitted together with', & ' COARRAY).', & '', & ' o COARRAY : if DIM present, required).', & '', & ' o DIM : If present, DIM shall be between one and the corank of COARRAY.', & '', & 'RESULT', & ' Default integer. If COARRAY is not present, it is scalar; if DISTANCE is not', & ' present or has value 0, its value is the image index on the invoking image', & ' for the current team, for values smaller or equal distance to the initial', & ' team, it returns the image index on the ancestor team which has a distance', & ' of DISTANCE from the invoking team. If DISTANCE is larger than the distance', & ' to the initial team, the image index of the initial team is returned.', & ' Otherwise when the COARRAY is present, if DIM is not present, a rank-1 array', & ' with corank elements is returned, containing the cosubscripts for COARRAY', & ' specifying the invoking image. If DIM is present, a scalar is returned, with', & ' the value of the DIM element of THIS_IMAGE(COARRAY).', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_this_image', & ' implicit none', & ' integer :: value[*]', & ' integer :: i', & ' value = this_image()', & ' sync all', & ' if (this_image() == 1) then', & ' do i = 1, num_images()', & ' write(*,''(2(a,i0))'') ''value['', i, ''] is '', value[i]', & ' end do', & ' endif', & ' end program demo_this_image', & '', & ' Results:', & '', & ' > value[1] is 1', & '', & 'STANDARD', & ' Fortran 2008. With DISTANCE argument, TS 18508', & '', & 'SEE ALSO', & ' NUM_IMAGES(3), IMAGE_INDEX(3)', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 this_image(3fortran)', & ''] shortname="this_image" call process() case('233','tiny') textblock=[character(len=256) :: & '', & 'tiny(3fortran) tiny(3fortran)', & '', & 'NAME', & ' TINY(3) - [MODEL:NUMERIC] Smallest positive number of a real kind', & '', & 'SYNOPSIS', & ' result = tiny(x)', & '', & ' real(kind=KIND) function tiny(x)', & '', & ' real(kind=KIND) :: x', & '', & 'CHARACTERISTICS', & ' o X may be any real scalar or array', & '', & ' o the result has the same type and kind as X', & '', & 'DESCRIPTION', & ' TINY(3) returns the smallest positive (non zero) number of the type and kind', & ' of X.', & '', & ' For real X', & '', & ' result = 2.0**(minexponent(x)-1)', & '', & 'OPTIONS', & ' o X : The value whose kind is used to determine the model type to query', & '', & 'RESULT', & ' The smallest positive value for the real type of the specified kind.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_tiny', & ' implicit none', & ' print *, ''default real is from'', tiny(0.0), ''to'',huge(0.0)', & ' print *, ''doubleprecision is from '', tiny(0.0d0), ''to'',huge(0.0d0)', & ' end program demo_tiny', & '', & ' Results:', & '', & ' > default real is from 1.17549435E-38 to 3.40282347E+38', & ' > doubleprecision is from 2.2250738585072014E-308 to', & ' > 1.7976931348623157E+308', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' DIGITS(3), EPSILON(3), EXPONENT(3), FRACTION(3), HUGE(3), MAXEXPONENT(3),', & ' MINEXPONENT(3), NEAREST(3), PRECISION(3), RADIX(3), RANGE(3), RRSPACING(3),', & ' SCALE(3), SET_EXPONENT(3), SPACING(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 tiny(3fortran)', & ''] shortname="tiny" call process() case('234','tokenize') textblock=[character(len=256) :: & '', & 'tokenize(3fortran) tokenize(3fortran)', & '', & 'NAME', & ' TOKENIZE(3) - [CHARACTER:PARSE] Parse a string into tokens', & '', & 'SYNOPSIS', & ' TOKEN form (returns array of strings)', & '', & ' subroutine tokenize(string, set, tokens [, separator])', & '', & ' character(len=*),intent(in) :: string', & ' character(len=*),intent(in) :: set', & ' character(len=:),allocatable,intent(out) :: tokens(:)', & ' character(len=1),allocatable,intent(out),optional :: separator(:)', & '', & ' ARRAY BOUNDS form (returns arrays defining token positions)', & '', & ' subroutine tokenize (string, set, first, last)', & '', & ' character(len=*),intent(in) :: string', & ' character(len=*),intent(in) :: set', & ' integer,allocatable,intent(out) :: first(:)', & ' integer,allocatable,intent(out) :: last(:)', & '', & 'CHARACTERISTICS', & ' o STRING - a scalar of type character. It is an INTENT(IN) argument.', & '', & ' o SET - a scalar of type character with the same kind type parameter as', & ' STRING. It is an INTENT(IN) argument.', & '', & ' o SEPARATOR - (optional) shall be of type character with the same kind type', & ' parameter as STRING. It is an INTENT(OUT)argument. It shall not be a', & ' coarray or a coindexed object.', & '', & ' o TOKENS - of type character with the same kind type parameter as STRING.', & ' It is an INTENT(OUT) argument. It shall not be a coarray or a coindexed', & ' object.', & '', & ' o FIRST,LAST - an allocatable array of type integer and rank one. It is an', & ' INTENT(OUT) argument. It shall not be a coarray or a coindexed object.', & '', & ' To reiterate, STRING, SET, TOKENS and SEPARATOR must all be of the same', & ' CHARACTER kind type parameter.', & '', & 'DESCRIPTION', & ' TOKENIZE(3) parses a string into tokens. There are two forms of the', & ' subroutine TOKENIZE(3).', & '', & ' o The token form returns an array with one token per element, all of the', & ' same length as the longest token.', & '', & ' o The array bounds form returns two integer arrays. One contains the', & ' beginning position of the tokens and the other the end positions.', & '', & ' Since the token form pads all the tokens to the same length the original', & ' number of trailing spaces of each token accept for the longest is lost.', & '', & ' The array bounds form retains information regarding the exact token length', & ' even when padded by spaces.', & '', & 'OPTIONS', & ' o STRING : The string to parse into tokens.', & '', & ' o SET : Each character in SET is a token delimiter. A sequence of zero or', & ' more characters in STRING delimited by any token delimiter, or the', & ' beginning or end of STRING, comprise a token. Thus, two consecutive token', & ' delimiters in STRING, or a token delimiter in the first or last character', & ' of STRING, indicate a token with zero length.', & '', & ' o TOKENS : It shall be an allocatable array of rank one with deferred', & ' length. It is allocated with the lower bound equal to one and the upper', & ' bound equal to the number of tokens in STRING, and with character length', & ' equal to the length of the longest token.', & '', & ' The tokens in STRING are assigned in the order found, as if by intrinsic', & ' assignment, to the elements of TOKENS, in array element order.', & '', & ' o FIRST : shall be an allocatable array of type integer and rank one. It', & ' is an INTENT(OUT) argument. It shall not be a coarray or a coindexed', & ' object.', & '', & ' It is allocated with the lower bound equal to one and the upper bound', & ' equal to the number of tokens in STRING. Each element is assigned, in', & ' array element order, the starting position of each token in STRING, in', & ' the order found.', & '', & ' If a token has zero length, the starting position is equal to one if the', & ' token is at the beginning of STRING, and one greater than the position of', & ' the preceding delimiter otherwise.', & '', & ' o LAST : It is allocated with the lower bound equal to one and the upper', & ' bound equal to the number of tokens in STRING. Each element is assigned,', & ' in array element order, the ending position of each token in STRING, in', & ' the order found.', & '', & ' If a token has zero length, the ending position is one less than the', & ' starting position.', & '', & 'EXAMPLES', & ' Sample of uses', & '', & ' program demo_tokenize', & ' !use M_strings, only : tokenize=>split2020', & ' implicit none', & ' ! some useful formats', & ' character(len=*),parameter :: brackets=''(*("[",g0,"]":,","))''', & ' character(len=*),parameter :: a_commas=''(a,*(g0:,","))''', & ' character(len=*),parameter :: space=''(*(g0:,1x))''', & ' character(len=*),parameter :: gen=''(*(g0))''', & '', & ' ! Execution of TOKEN form (return array of tokens)', & '', & ' block', & ' character (len=:), allocatable :: string', & ' character (len=:), allocatable :: tokens(:)', & ' character (len=:), allocatable :: kludge(:)', & ' integer :: i', & ' string = '' first,second ,third ''', & ' call tokenize(string, set='';,'', tokens=tokens )', & ' write(*,brackets)tokens', & '', & ' string = '' first , second ,third ''', & ' call tokenize(string, set='' ,'', tokens=tokens )', & ' write(*,brackets)(trim(tokens(i)),i=1,size(tokens))', & ' ! remove blank tokens', & ' ! <<<', & ' !tokens=pack(tokens, tokens /= '''' )', & ' ! gfortran 13.1.0 bug -- concatenate //'''' and use scratch', & ' ! variable KLUDGE. JSU: 2024-08-18', & ' kludge=pack(tokens//'''', tokens /= '''' )', & ' ! >>>', & ' write(*,brackets)kludge', & '', & ' endblock', & '', & ' ! Execution of BOUNDS form (return position of tokens)', & '', & ' block', & ' character (len=:), allocatable :: string', & ' character (len=*),parameter :: set = " ,"', & ' integer, allocatable :: first(:), last(:)', & ' write(*,gen)repeat(''1234567890'',6)', & ' string = ''first,second,,fourth''', & ' write(*,gen)string', & ' call tokenize (string, set, first, last)', & ' write(*,a_commas)''FIRST='',first', & ' write(*,a_commas)''LAST='',last', & ' write(*,a_commas)''HAS LENGTH='',last-first.gt.0', & ' endblock', & '', & ' end program demo_tokenize', & '', & ' Results:', & '', & ' > [ first ],[second ],[third ]', & ' > [],[first],[],[],[second],[],[third],[],[],[],[],[]', & ' > [first ],[second],[third ]', & ' > 123456789012345678901234567890123456789012345678901234567890', & ' > first,second,,fourth', & ' > FIRST=1,7,14,15', & ' > LAST=5,12,13,20', & ' > HAS LENGTH=T,T,F,T', & '', & 'STANDARD', & ' Fortran 2023', & '', & 'SEE ALSO', & ' o SPLIT(3) - return tokens from a string, one at a time', & '', & ' o INDEX(3) - Position of a substring within a string', & '', & ' o SCAN(3) - Scan a string for the presence of a set of characters', & '', & ' o VERIFY(3) - Position of a character in a string of characters that does', & ' not appear in a given set of characters.', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 tokenize(3fortran)', & ''] shortname="tokenize" call process() case('235','trailz') textblock=[character(len=256) :: & '', & 'trailz(3fortran) trailz(3fortran)', & '', & 'NAME', & ' TRAILZ(3) - [BIT:COUNT] Number of trailing zero bits of an integer', & '', & 'SYNOPSIS', & ' result = trailz(i)', & '', & ' elemental integer function trailz(i)', & '', & ' integer(kind=**),intent(in) :: i', & '', & 'CHARACTERISTICS', & ' o I is an integer of any kind.', & '', & ' o the result is an integer of default kind', & '', & 'DESCRIPTION', & ' TRAILZ(3) returns the number of trailing zero bits of an integer value.', & '', & 'OPTIONS', & ' o I : the value to count trailing zero bits in', & '', & 'RESULT', & ' The number of trailing rightmost zero bits in an integer value after the', & ' last non-zero bit.', & '', & ' > right-most non-zero bit', & ' > V', & ' > |0|0|0|1|1|1|0|1|0|0|0|0|0|0|', & ' > ^ |___________| trailing zero bits', & ' > bit_size(i)', & '', & ' If all the bits of I are zero, the result is the size of the input value in', & ' bits, ie. BIT_SIZE(I).', & '', & ' The result may also be seen as the position of the rightmost 1 bit in I,', & ' starting with the rightmost bit being zero and counting to the left.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_trailz', & '', & ' ! some common integer kinds', & ' use, intrinsic :: iso_fortran_env, only : &', & ' & integer_kinds, int8, int16, int32, int64', & '', & ' implicit none', & '', & ' ! a handy format', & ' character(len=*),parameter :: &', & ' & show = ''(1x,"value=",i4,", value(bits)=",b32.32,1x,", trailz=",i3)''', & '', & ' integer(kind=int64) :: bigi', & ' ! basics', & ' write(*,*)''Note default integer is'',bit_size(0),''bits''', & ' print show, -1, -1, trailz(-1)', & ' print show, 0, 0, trailz(0)', & ' print show, 1, 1, trailz(1)', & ' print show, 96, 96, trailz(96)', & ' ! elemental', & ' print *, ''elemental and any integer kind:''', & ' bigi=2**5', & ' write(*,*) trailz( [ bigi, bigi*256, bigi/2 ] )', & ' write(*,''(1x,b64.64)'')[ bigi, bigi*256, bigi/2 ]', & '', & ' end program demo_trailz', & '', & ' Results:', & '', & ' > Note default integer is 32 bits', & ' > value= -1, value(bits)=11111111111111111111111111111111 , trailz= 0', & ' > value= 0, value(bits)=00000000000000000000000000000000 , trailz= 32', & ' > value= 1, value(bits)=00000000000000000000000000000001 , trailz= 0', & ' > value= 96, value(bits)=00000000000000000000000001100000 , trailz= 5', & ' > elemental and any integer kind:', & ' > 5 13 4', & ' > 0000000000000000000000000000000000000000000000000000000000100000', & ' > 0000000000000000000000000000000000000000000000000010000000000000', & ' > 0000000000000000000000000000000000000000000000000000000000010000', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' BIT_SIZE(3), POPCNT(3), POPPAR(3), LEADZ(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 trailz(3fortran)', & ''] shortname="trailz" call process() case('236','transfer') textblock=[character(len=256) :: & '', & 'transfer(3fortran) transfer(3fortran)', & '', & 'NAME', & ' TRANSFER(3) - [TYPE:CONVERSION] Transfer data as bit patterns using mold', & '', & 'SYNOPSIS', & ' result = transfer(source, mold [,size] )', & '', & ' type(TYPE(kind=KIND)) function transfer(source,mold,size)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: source(..)', & ' type(TYPE(kind=KIND)),intent(in) :: mold(..)', & ' integer(kind=**),intent(in),optional :: size', & '', & 'CHARACTERISTICS', & ' o SOURCE shall be a scalar or an array of any type.', & '', & ' o MOLD shall be a scalar or an array of any type.', & '', & ' o SIZE shall be a scalar of type integer.', & '', & ' o RESULT has the same type as MOLD', & '', & 'DESCRIPTION', & ' TRANSFER(3) copies the bitwise representation of SOURCE in memory into a', & ' variable or array of the same type and type parameters as MOLD.', & '', & ' This is approximately equivalent to the C concept of "casting" one type to', & ' another.', & '', & 'OPTIONS', & ' o SOURCE : Holds the bit pattern to be copied', & '', & ' o MOLD : the type of MOLD is used to define the type of the returned value.', & ' In addition, if it is an array the returned value is a one-dimensional', & ' array. If it is a scalar the returned value is a scalar.', & '', & ' o SIZE : If SIZE is present, the result is a one-dimensional array of', & ' length SIZE.', & '', & ' If SIZE is absent but MOLD is an array (of any size or shape), the result is', & ' a one-dimensional array of the minimum length needed to contain the entirety', & ' of the bitwise representation of SOURCE.', & '', & ' If SIZE is absent and MOLD is a scalar, the result is a scalar.', & '', & 'RESULT', & ' The result has the bit level representation of SOURCE.', & '', & ' If the bitwise representation of the result is longer than that of SOURCE,', & ' then the leading bits of the result correspond to those of SOURCE but any', & ' trailing bits are filled arbitrarily.', & '', & ' When the resulting bit representation does not correspond to a valid', & ' representation of a variable of the same type as MOLD, the results are', & ' undefined, and subsequent operations on the result cannot be guaranteed to', & ' produce sensible behavior. For example, it is possible to create logical', & ' variables for which VAR and .NOT.VAR both appear to be true.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_transfer', & ' use,intrinsic :: iso_fortran_env, only : int32, real32', & ' integer(kind=int32) :: i = 2143289344', & ' real(kind=real32) :: x', & ' character(len=10) :: string', & ' character(len=1) :: chars(10)', & ' x=transfer(i, 1.0) ! prints "nan" on i686', & ' ! the bit patterns are the same', & ' write(*,''(b0,1x,g0)'')x,x ! create a NaN', & ' write(*,''(b0,1x,g0)'')i,i', & '', & ' ! a string to an array of characters', & ' string=''abcdefghij''', & ' chars=transfer(string,chars)', & ' write(*,''(*("[",a,"]":,1x))'')string', & ' write(*,''(*("[",a,"]":,1x))'')chars', & ' end program demo_transfer', & '', & ' Results:', & '', & ' > 1111111110000000000000000000000 NaN', & ' > 1111111110000000000000000000000 2143289344', & ' > [abcdefghij]', & ' > [a] [b] [c] [d] [e] [f] [g] [h] [i] [j]', & '', & 'COMMENTS', & ' Joe Krahn: Fortran uses MOLDING rather than CASTING.', & '', & ' Casting, as in C, is an in-place reinterpretation. A cast is a device that', & ' is built around an object to change its shape.', & '', & ' Fortran TRANSFER(3) reinterprets data out-of-place. It can be considered', & ' MOLDING rather than casting. A MOLD is a device that confers a shape onto an', & ' object placed into it.', & '', & ' The advantage of molding is that data is always valid in the context of the', & ' variable that holds it. For many cases, a decent compiler should optimize', & ' TRANSFER(3) into a simple assignment.', & '', & ' There are disadvantages of this approach. It is problematic to define a', & ' union of data types because you must know the largest data object, which can', & ' vary by compiler or compile options. In many cases, an EQUIVALENCE would be', & ' far more effective, but Fortran Standards committees seem oblivious to the', & ' benefits of EQUIVALENCE when used sparingly.', & '', & 'STANDARD', & ' Fortran 90', & '', & 'SEE ALSO', & ' -equivalence(7) - alias storage', & '', & ' Fortran intrinsic descriptions', & '', & ' March 16, 2025 transfer(3fortran)', & ''] shortname="transfer" call process() case('237','transpose') textblock=[character(len=256) :: & '', & 'transpose(3fortran) transpose(3fortran)', & '', & 'NAME', & ' TRANSPOSE(3) - [ARRAY:MANIPULATION] Transpose an array of rank two', & '', & 'SYNOPSIS', & ' result = transpose(matrix)', & '', & ' function transpose(matrix)', & '', & ' type(TYPE(kind=KIND)) :: transpose(N,M)', & ' type(TYPE(kind=KIND)),intent(in) :: matrix(M,N)', & '', & 'CHARACTERISTICS', & ' o MATRIX is an array of any type with a rank of two.', & '', & ' o The result will be the same type and kind as MATRIX and the reversed', & ' shape of the input array', & '', & 'DESCRIPTION', & ' TRANSPOSE(3) transposes an array of rank two.', & '', & ' An array is transposed by interchanging the rows and columns of the given', & ' matrix. That is, element (i,j) of the result has the value of element (j,i)', & ' of the input for all (i,j).', & '', & 'OPTIONS', & ' o MATRIX : The array to transpose', & '', & 'RESULT', & ' The transpose of the input array. The result has the same type as MATRIX,', & ' and has shape [ m, n ] if MATRIX has shape [ n, m ].', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_transpose', & ' implicit none', & ' integer,allocatable :: array(:,:)', & ' integer,parameter :: values(3,5)= reshape([&', & ' 1, 2, 3, 4, 5, &', & ' 10, 20, 30, 40, 50, &', & ' 11, 22, 33, 44, -1055 &', & ' ],shape(values),order=[2,1])', & '', & ' array=values', & ' call print_matrix_int(''array:'',array)', & ' array=transpose(array)', & ' call print_matrix_int(''array transposed:'',array)', & ' array=transpose(array)', & ' call print_matrix_int(''transposed transpose:'',array)', & '', & ' contains', & '', & ' subroutine print_matrix_int(title,arr)', & ' ! print small 2d integer arrays in row-column format', & ' implicit none', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: arr(:,:)', & ' integer :: i', & ' character(len=:),allocatable :: biggest', & ' ! print title', & ' write(*,''(a," shape(",i0,",",i0,")")'')trim(title),shape(arr)', & ' biggest='' '' ! make buffer to write integer into', & ' ! find how many characters to use for integers', & ' write(biggest,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(arr))))))+2', & ' ! use this format to write a row', & ' biggest=''(" [",*(i''//trim(biggest)//'':,","))''', & ' ! print one row of array at a time', & ' do i=1,size(arr,dim=1)', & ' write(*,fmt=biggest,advance=''no'')arr(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & ' end subroutine print_matrix_int', & '', & ' end program demo_transpose', & '', & ' Results:', & '', & ' > array: shape(3,5)', & ' > [ 1, 2, 3, 4, 5 ]', & ' > [ 10, 20, 30, 40, 50 ]', & ' > [ 11, 22, 33, 44, -1055 ]', & ' > array transposed: shape(5,3)', & ' > [ 1, 10, 11 ]', & ' > [ 2, 20, 22 ]', & ' > [ 3, 30, 33 ]', & ' > [ 4, 40, 44 ]', & ' > [ 5, 50, -1055 ]', & ' > transposed transpose: shape(3,5)', & ' > [ 1, 2, 3, 4, 5 ]', & ' > [ 10, 20, 30, 40, 50 ]', & ' > [ 11, 22, 33, 44, -1055 ]', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' o MERGE(3) - Merge variables', & '', & ' o PACK(3) - Pack an array into an array of rank one', & '', & ' o SPREAD(3) - Add a dimension and replicate data', & '', & ' o UNPACK(3) - Scatter the elements of a vector', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 transpose(3fortran)', & ''] shortname="transpose" call process() case('238','trim') textblock=[character(len=256) :: & '', & 'trim(3fortran) trim(3fortran)', & '', & 'NAME', & ' TRIM(3) - [CHARACTER:WHITESPACE] Remove trailing blank characters from a', & ' string', & '', & 'SYNOPSIS', & ' result = trim(string)', & '', & ' character(len=:,kind=KIND) function trim(string)', & '', & ' character(len=*,kind=KIND),intent(in) :: string', & '', & 'CHARACTERISTICS', & ' o KIND can be any kind supported for the character type.', & '', & ' o The result has the same type and kind as the input argument STRING.', & '', & 'DESCRIPTION', & ' TRIM(3) removes trailing blank characters from a string.', & '', & 'OPTIONS', & ' o STRING : A string to trim', & '', & 'RESULT', & ' The result is the same as STRING except trailing blanks are removed.', & '', & ' If STRING is composed entirely of blanks or has zero length, the result has', & ' zero length.', & '', & 'EXAMPLES', & ' Sample program:', & '', & ' program demo_trim', & ' implicit none', & ' character(len=:), allocatable :: str, strs(:)', & ' character(len=*),parameter :: brackets=''( *("[",a,"]":,1x) )''', & ' integer :: i', & '', & ' str='' trailing ''', & ' print brackets, str,trim(str) ! trims it', & '', & ' str='' leading''', & ' print brackets, str,trim(str) ! no effect', & '', & ' str='' ''', & ' print brackets, str,trim(str) ! becomes zero length', & ' print *, len(str), len(trim('' ''))', & '', & ' ! array elements are all the same length, so you often', & ' ! want to print them', & ' strs=[character(len=10) :: "Z"," a b c","ABC",""]', & '', & ' write(*,*)''untrimmed:''', & ' ! everything prints as ten characters; nice for neat columns', & ' print brackets, (strs(i), i=1,size(strs))', & ' print brackets, (strs(i), i=size(strs),1,-1)', & ' write(*,*)''trimmed:''', & ' ! everything prints trimmed', & ' print brackets, (trim(strs(i)), i=1,size(strs))', & ' print brackets, (trim(strs(i)), i=size(strs),1,-1)', & '', & ' end program demo_trim', & '', & ' Results:', & '', & ' > [ trailing ] [ trailing]', & ' > [ leading] [ leading]', & ' > [ ] []', & ' > 12 0', & ' > untrimmed:', & ' > [Z ] [ a b c ] [ABC ] [ ]', & ' > [ ] [ABC ] [ a b c ] [Z ]', & ' > trimmed:', & ' > [Z] [ a b c] [ABC] []', & ' > [] [ABC] [ a b c] [Z]', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3), VERIFY(3)', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 trim(3fortran)', & ''] shortname="trim" call process() case('239','ubound') textblock=[character(len=256) :: & '', & 'ubound(3fortran) ubound(3fortran)', & '', & 'NAME', & ' UBOUND(3) - [ARRAY:INQUIRY] Upper dimension bounds of an array', & '', & 'SYNOPSIS', & ' result = ubound(array [,dim] [,kind] )', & '', & ' elemental TYPE(kind=KIND) function ubound(array,dim,kind)', & '', & ' TYPE(kind=KIND),intent(in) :: array', & ' integer(kind=**),intent(in),optional :: dim', & ' integer(kind=**),intent(in),optional :: kind', & '', & 'CHARACTERISTICS', & ' o ARRAY shall be assumed-rank or an array, of any type. It cannot be an', & ' unallocated allocatable array or a pointer that is not associated.', & '', & ' o DIM shall be a scalar integer. The corresponding actual argument shall', & ' not be an optional dummy argument, a disassociated pointer, or an', & ' unallocated allocatable.', & '', & ' o KIND an integer initialization expression indicating the kind parameter', & ' of the result.', & '', & ' o The return value is of type integer and of kind KIND. If KIND is absent,', & ' the return value is of default integer kind. The result is scalar if DIM', & ' is present; otherwise, the result is an array of rank one and size n,', & ' where n is the rank of ARRAY.', & '', & ' o a kind designated as ** may be any supported kind for the type', & '', & 'DESCRIPTION', & ' UBOUND(3) returns the upper bounds of an array, or a single upper bound', & ' along the DIM dimension.', & '', & 'OPTIONS', & ' o ARRAY : The assumed-rank or array of any type whose upper bounds are to', & ' be determined. If allocatable it must be allocated; if a pointer it must', & ' be associated. If an assumed-size array, DIM must be present.', & '', & ' o DIM : a specific dimension of ARRAY to determine the bounds of. If DIM is', & ' absent, the result is an array of the upper bounds of ARRAY. DIM is', & ' required if ARRAY is an assumed-size array, and in that case must be less', & ' than or equal to the rank of ARRAY.', & '', & ' o KIND : indicates the kind parameter of the result. If absent, an integer', & ' of the default kind is returned.', & '', & 'RESULT', & ' The return value is of type integer and of kind KIND. If KIND is absent, the', & ' return value is of default integer kind.', & '', & ' If DIM is absent, the result is an array of the upper bounds of each', & ' dimension of the ARRAY.', & '', & ' If DIM is present, the result is a scalar corresponding to the upper bound', & ' of the array along that dimension.', & '', & ' If ARRAY is an expression rather than a whole array or array structure', & ' component, or if it has a zero extent along the relevant dimension, the', & ' upper bound is taken to be the number of elements along the relevant', & ' dimension.', & '', & ' NOTE1 If ARRAY is assumed-rank and has rank zero, DIM cannot be present', & ' since it cannot satisfy the requirement 1 <= DIM <= 0.', & '', & 'EXAMPLES', & ' Note this function should not be used on assumed-size arrays or in any', & ' function without an explicit interface. Errors can occur if there is no', & ' interface defined.', & '', & ' Sample program', & '', & ' ! program demo_ubound', & ' module m2_bounds', & ' implicit none', & '', & ' contains', & '', & ' subroutine msub(arr)', & ' !!integer,intent(in) :: arr(*) ! cannot be assumed-size array', & ' integer,intent(in) :: arr(:)', & ' write(*,*)''MSUB: LOWER='',lbound(arr),''UPPER='',ubound(arr), &', & ' & ''SIZE='',size(arr)', & ' end subroutine msub', & '', & ' end module m2_bounds', & ' !', & ' program demo_ubound', & ' use m2_bounds, only : msub', & ' implicit none', & ' interface', & ' subroutine esub(arr)', & ' integer,intent(in) :: arr(:)', & ' end subroutine esub', & ' end interface', & ' integer :: arr(-10:10)', & ' write(*,*)''MAIN: LOWER='',lbound(arr),''UPPER='',ubound(arr), &', & ' & ''SIZE='',size(arr)', & ' call csub()', & ' call msub(arr)', & ' call esub(arr)', & ' contains', & ' subroutine csub', & ' write(*,*)''CSUB: LOWER='',lbound(arr),''UPPER='',ubound(arr), &', & ' & ''SIZE='',size(arr)', & ' end subroutine csub', & '', & ' end', & '', & ' subroutine esub(arr)', & ' implicit none', & ' integer,intent(in) :: arr(:)', & ' ! WARNING: IF CALLED WITHOUT AN EXPLICIT INTERFACE', & ' ! THIS WILL GIVE UNDEFINED ANSWERS (like 0,0,0)', & ' write(*,*)''ESUB: LOWER='',lbound(arr),''UPPER='',ubound(arr), &', & ' & ''SIZE='',size(arr)', & ' end subroutine esub', & ' !end program demo_ubound', & '', & ' Results:', & '', & ' > MAIN: LOWER= -10 UPPER= 10 SIZE= 21', & ' > CSUB: LOWER= -10 UPPER= 10 SIZE= 21', & ' > MSUB: LOWER= 1 UPPER= 21 SIZE= 21', & ' > ESUB: LOWER= 1 UPPER= 21 SIZE= 21', & '', & 'STANDARD', & ' Fortran 95 , with KIND argument Fortran 2003', & '', & 'SEE ALSO', & ' Array inquiry:', & '', & ' o SIZE(3) - Determine the size of an array', & '', & ' o RANK(3) - Rank of a data object', & '', & ' o SHAPE(3) - Determine the shape of an array', & '', & ' o LBOUND(3) - Lower dimension bounds of an array', & '', & ' CO_UBOUND(3), CO_LBOUND(3)', & '', & ' State Inquiry:', & '', & ' o ALLOCATED(3) - Status of an allocatable entity', & '', & ' o IS_CONTIGUOUS(3) - Test if object is contiguous', & '', & ' Kind Inquiry:', & '', & ' o KIND(3) - Kind of an entity', & '', & ' Bit Inquiry:', & '', & ' o STORAGE_SIZE(3) - Storage size in bits', & '', & ' o BIT_SIZE(3) - Bit size inquiry function', & '', & ' o BTEST(3) - Tests a bit of an integer value.', & '', & ' o LBOUND(3),', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 ubound(3fortran)', & ''] shortname="ubound" call process() case('240','ucobound') textblock=[character(len=256) :: & '', & 'ucobound(3fortran) ucobound(3fortran)', & '', & 'NAME', & ' UCOBOUND(3) - [COLLECTIVE] Upper codimension bounds of an array', & '', & 'SYNOPSIS', & ' result = ucobound(coarray [,dim] [,kind] )', & '', & 'CHARACTERISTICS', & 'DESCRIPTION', & ' UCOBOUND(3) returns the upper cobounds of a coarray, or a single upper', & ' cobound along the DIM codimension.', & '', & 'OPTIONS', & ' o ARRAY : Shall be an coarray, of any type.', & '', & ' o DIM : (Optional) Shall be a scalar integer.', & '', & ' o KIND : (Optional) An integer initialization expression indicating the', & ' kind parameter of the result.', & '', & 'RESULT', & ' The return value is of type integer and of kind KIND. If KIND is absent, the', & ' return value is of default integer kind. If DIM is absent, the result is an', & ' array of the lower cobounds of COARRAY. If DIM is present, the result is a', & ' scalar corresponding to the lower cobound of the array along that', & ' codimension.', & '', & 'STANDARD', & ' Fortran 2008', & '', & 'SEE ALSO', & ' LCOBOUND(3), LBOUND(3), UBOUND(3)', & '', & ' March 16, 2025 ucobound(3fortran)', & ''] shortname="ucobound" call process() case('241','unpack') textblock=[character(len=256) :: & '', & 'unpack(3fortran) unpack(3fortran)', & '', & 'NAME', & ' UNPACK(3) - [ARRAY:CONSTRUCTION] Scatter the elements of a vector into an', & ' array using a mask', & '', & 'SYNOPSIS', & ' result = unpack(vector, mask, field)', & '', & ' type(TYPE(kind=KIND)) unpack(vector, mask, field)', & '', & ' type(TYPE(kind=KIND)),intent(in) :: vector(:)', & ' logical,intent(in) :: mask(..)', & ' type(TYPE(kind=KIND)),intent(in) :: field(..)', & '', & 'CHARACTERISTICS', & ' o VECTOR is a rank-one array of any type', & '', & ' o MASK is a logical array', & '', & ' o FIELD is the same type and type parameters as VECTOR conformable with', & ' MASK.', & '', & ' o The result is an array of the same type and type parameters as VECTOR and', & ' the same shape as MASK.', & '', & 'DESCRIPTION', & ' UNPACK(3) scatters the elements of VECTOR into a copy of an array FIELD of', & ' any rank using .true. values from MASK in array element order to specify', & ' placement of the VECTOR values.', & '', & ' So a copy of FIELD is generated with select elements replaced with values', & ' from VECTOR. This allows for complex replacement patterns that would be', & ' difficult when using array syntax or multiple assignment statements,', & ' particularly when the replacements are conditional.', & '', & 'OPTIONS', & ' o VECTOR : New values to place into specified locations in FIELD. It shall', & ' have at least as many elements as MASK has .true. values.', & '', & ' o MASK : Shall be an array that specifies which values in FIELD are to be', & ' replaced with values from VECTOR.', & '', & ' o FIELD : The input array to be altered.', & '', & 'RESULT', & ' The element of the result that corresponds to the ith true element of MASK,', & ' in array element order, has the value VECTOR(I) for i = 1, 2, . . ., t,', & ' where t is the number of true values in MASK. Each other element has a value', & ' equal to FIELD if FIELD is scalar or to the corresponding element of FIELD', & ' if it is an array.', & '', & ' The resulting array corresponds to FIELD with .true. elements of MASK', & ' replaced by values from VECTOR in array element order.', & '', & 'EXAMPLES', & ' Particular values may be "scattered" to particular positions in an array by', & ' using', & '', & ' 1 0 0', & '', & ' If M is the array', & ' 0 1 0 0 0 1', & '', & ' V is the array [1, 2, 3], . T .', & '', & ' and Q is the logical mask', & ' T . . . . T where "T" represents true and "." represents false, then', & ' the result of', & '', & ' UNPACK (V, MASK = Q, FIELD = M) has the value', & '', & ' 1 2 0 1 1 0 0 0 3', & '', & ' and the result of UNPACK (V, MASK = Q, FIELD = 0) has the value', & '', & ' 0 2 0 1 0 0 0 0 3', & '', & ' Sample program:', & '', & ' program demo_unpack', & ' implicit none', & ' logical,parameter :: T=.true., F=.false.', & '', & ' integer :: vector(2) = [1,1]', & '', & ' ! mask and field must conform', & ' integer,parameter :: r=2, c=2', & ' logical :: mask(r,c) = reshape([ T,F,F,T ],[2,2])', & ' integer :: field(r,c) = 0, unity(2,2)', & '', & ' ! basic usage', & ' unity = unpack( vector, mask, field )', & ' call print_matrix_int(''unity='', unity)', & '', & ' ! if FIELD is a scalar it is used to fill all the elements', & ' ! not assigned to by the vector and mask.', & ' call print_matrix_int(''scalar field'', &', & ' & unpack( &', & ' & vector=[ 1, 2, 3, 4 ], &', & ' & mask=reshape([ T,F,T,F,F,F,T,F,T ], [3,3]), &', & ' & field=0) )', & '', & ' contains', & '', & ' subroutine print_matrix_int(title,arr)', & ' ! convenience routine:', & ' ! just prints small integer arrays in row-column format', & ' implicit none', & ' character(len=*),intent(in) :: title', & ' integer,intent(in) :: arr(:,:)', & ' integer :: i', & ' character(len=:),allocatable :: biggest', & '', & ' write(*,*)trim(title)', & ' ! make buffer to write integer into', & ' biggest='' ''', & ' ! find how many characters to use for integers', & ' write(biggest,''(i0)'')ceiling(log10(max(1.0,real(maxval(abs(arr))))))+2', & ' ! use this format to write a row', & ' biggest=''(" [",*(i''//trim(biggest)//'':,","))''', & ' ! print one row of array at a time', & ' do i=1,size(arr,dim=1)', & ' write(*,fmt=biggest,advance=''no'')arr(i,:)', & ' write(*,''(" ]")'')', & ' enddo', & ' end subroutine print_matrix_int', & '', & ' end program demo_unpack', & '', & ' Results:', & '', & ' > unity=', & ' > [ 1, 0 ]', & ' > [ 0, 1 ]', & ' > scalar field', & ' > [ 1, 0, 3 ]', & ' > [ 0, 0, 0 ]', & ' > [ 2, 0, 4 ]', & '', & 'STANDARD', & ' Fortran 95', & '', & 'SEE ALSO', & ' MERGE(3), PACK(3), SPREAD(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 unpack(3fortran)', & ''] shortname="unpack" call process() case('242','use') textblock=[character(len=256) :: & '', & 'use(7fortran) use(7fortran)', & '', & 'NAME', & ' use(7f) - [FORTRAN] gives a program unit access to public entities in a', & ' module.', & '', & 'SYNOPSIS', & ' There are two forms. One loads all public entities optionally renaming', & ' selected entities:', & '', & ' USE [, nature ::] module_name [, rename-list]', & '', & ' The other makes accessible only explicitly named entities', & '', & ' USE [, nature ::] module_name, ONLY: only-list', & '', & 'DESCRIPTION', & ' The USE statement makes the entities in the specified module accessible to', & ' the current scoping unit. It also provides a means of renaming those', & ' entities with a rename-list and/or only importing a subset of the public', & ' entities from the module with an only-list.', & '', & ' The entities accessed from the module may be named data objects,', & ' nonintrinsic types, procedures, abstract interfaces, generic identifiers,', & ' and namelist groups', & '', & ' If more than one USE statement appears in a scoping unit, the rename-lists', & ' are treated as one rename-list and the only-lists are treated as one', & ' concatenated only-list.', & '', & ' At the time a USE statement is processed, the public portions of the', & ' specified module shall be available. That is, the module typically needs to', & ' be compiled and found in the current search directories or previously in the', & ' current source files.', & '', & ' A module shall not reference itself, either directly or indirectly.', & '', & ' A USE statement without ONLY provides access to all PUBLIC entities in the', & ' specified namespace. This is true even if renamed entities are specified,', & ' but the renamed entities will only be available with the specified local', & ' name unless also explicitity requested with the original name. This is', & ' particularly useful behavior when there would otherwise be name conflicts.', & '', & ' A USE statement with ONLY provides access only to those entities that appear', & ' in the only-list. It does not otherwise affect what is public due to a', & ' statement without ONLY.', & '', & 'REMARKS', & ' A use-associated variable is considered to have been previously declared;', & ' any other use-associated entity is considered to have been previously', & ' defined.', & '', & ' So accessed entities have their attributes (TYPE,KIND,...) specified via the', & ' module, except that an accessed entity may have a different accessibility', & ' attribute (eg. be declared PRIVATE or PUBLIC), it may be given the', & ' ASYNCHRONOUS attribute even if the associated module entity does not, and if', & ' it is not a coarray it may have the VOLATILE attribute specified even if the', & ' associated entity from the module does not.', & '', & ' If two or more generic interfaces that are accessible in the same scoping', & ' unit have the same name, same operator, or are assignments, they are', & ' interpreted as a single generic interface (that is, if there are no', & ' conflicts they are merged).', & '', & ' Two or more accessible entities, other than generic interfaces, can have the', & ' same name only if no entity is referenced by this name in the scoping unit.', & ' That is, there can be no other conflicts unless the entities are not used.', & '', & ' If local-name is absent, the use-name is available by use association.', & '', & ' An entity can be accessed by more than one local-name.', & '', & ' A local-name must not be declared with different attributes in the scoping', & ' unit that contains the USE statement, except that it can appear in a PUBLIC', & ' or PRIVATE statement in the scoping unit of a module.', & '', & ' Forward references to modules are not allowed. That is, if a module is used', & ' in the same source file in which it resides, the module program unit must', & ' appear before its use.', & '', & ' Definability of module entities can be controlled by the PROTECTED', & ' attribute.', & '', & ' o OPERATOR (use-defined-operator) shall not identify a type-bound generic', & ' interface.', & '', & ' o The generic-spec shall not identify a type-bound generic interface.', & '', & ' These Constraints do not prevent accessing a generic-spec that is declared', & ' by an interface block, even if a type-bound generic interface has the same', & ' generic-spec.', & '', & ' o An only-use-name shall be a nongeneric name.', & '', & ' A USE statement with the ONLY option provides access only to those entities', & ' that appear as generic-specs, use-names, or use-defined-operators in the', & ' only-list.', & '', & ' There is no prohibition against a use-name or use-defined-operator appearing', & ' multiple times in one USE state- ment or in multiple USE statements', & ' involving the same module. As a result, it is possible for one use-', & ' associated entity to be accessible by more than one local identifier.', & '', & ' An entity in a scoping unit that is accessed by use association through more', & ' than one use path, has the ASYN- CHRONOUS or VOLATILE attribute in any of', & ' those use paths, and is not given that attribute in that scoping unit, shall', & ' have that attribute in all use paths.', & '', & ' the local-name is prohibited from appearing in a COMMON BLOCK or an', & ' EQUIVALENCE statement or a namelist-group-name in a NAMELIST statement,', & ' respectively. There is no prohibition against the local-name appearing as a', & ' common-block-name or a namelist-group-object.', & '', & 'OPTIONS', & ' o NATURE : Is INTRINSIC or NON_INTRINSIC. If INTRINSIC is used, namespace', & ' must be the name of an intrinsic module. If NON_INTRINSIC is used,', & ' namespace must be the name of an nonintrinsic module. If NATURE is not', & ' specified, a module of name namespace must be accessible. If both an', & ' intrinsic and non-intrinsic module of the same name exist and nature is', & ' not specified, the non-intrinsic module is used.', & '', & ' It is an error to specify a user module and an intrinsic module of the', & ' same name in the same program unit.', & '', & ' o MODULE_NAME : is a publicly accessible namespace; ie. it is the name of a', & ' module.', & '', & ' o RENAME-LIST : is a comma-separated list of local-name => use-name.', & '', & ' o ONLY-LIST : is a comma-separated list of access-ids or [local-name =>', & ' use-name]', & '', & ' where', & '', & ' local-name Is the local name for the entity in the', & ' program unit using the module or is', & ' "OPERATOR (op-name)", where op-name is', & ' the name of a defined operator in the', & ' program unit using the module.', & ' use-name is the name of a public entity in the', & ' specified namespace', & ' access-id is use-name or generic-spec', & ' generic-spec is generic-name', & ' or OPERATOR (defined-operator)', & ' or ASSIGNMENT (=)', & '', & ' GENERIC-NAME is the name of a generic procedure', & '', & ' DEFINED-OPERATOR is one of the intrinsic operators or .OP-NAME.', & '', & ' .OP-NAME. is a user-defined name for the operation', & '', & 'EXAMPLES', & ' Samples:', & '', & ' ! program demo_use and module examples', & ' module example ! example is the namespace name', & ' use,intrinsic :: iso_fortran_env , only : real64', & '', & ' type type1 ! type1 is the class prototype name', & ' contains', & ' procedure, nopass :: static_method1', & ' end type type1', & '', & ' type type2 ! type1 is the class prototype name', & ' contains', & ' procedure, nopass :: static_method2', & ' end type type2', & '', & ' real(kind=real64),parameter :: &', & ' pi = 3.1415926535897932_real64', & ' ! Napier''s constant is the base of the natural logarithm', & ' ! system. It is often denoted by "e" in honor of Euler.', & ' real(kind=real64),parameter :: &', & ' Napier_constant = 2.71828182845904523_real64', & '', & ' contains', & '', & ' subroutine static_method1(arg)', & ' integer :: arg', & ' ! code to implement method goes here', & ' end subroutine static_method1', & '', & ' subroutine static_method2(arg)', & ' integer :: arg', & ' ! code to implement method goes here', & ' end subroutine static_method2', & '', & ' end module example', & ' program demo_use', & ' use example, only: type1 ! class prototype type1 available,', & ' ! but nothing else is made available by this', & ' !', & ' ! (additionally) within this scoping unit, type1 is referred to', & ' ! as "mytype"', & ' use example, mytype => type1', & ' !', & ' ! only: is recommended but for long lists importing everything', & ' ! without listing it is supported:', & ' use example ! all public objects in namespace example available', & ' !', & ' ! some popular intrinsic entities', & ' !', & ' use,intrinsic :: iso_fortran_env, only : &', & ' stderr=>ERROR_UNIT, stdin=>INPUT_UNIT, stdout=>OUTPUT_UNIT', & ' ! specifying INTRINSIC or NON_INTRINSIC is typically optional but', & ' ! indicating INTRINSIC when it is so is the norm.', & ' use :: iso_fortran_env, only : integer_kinds,int8,int16,int32,int64', & ' use iso_fortran_env, only : real_kinds,real32,real64,real128', & ' ! duplicates are OK', & ' use,intrinsic :: iso_fortran_env, only : sp=>real32,dp=>real64', & ' use,intrinsic :: iso_fortran_env, only : integer_kinds', & ' use,intrinsic :: iso_fortran_env, only : compiler_version', & ' use,intrinsic :: iso_fortran_env, only : compiler_options', & ' use,intrinsic :: iso_fortran_env, only : iostat_eor, iostat_end', & ' end program demo_use', & '', & 'SUBTLE ISSUES WITH MULTIPLE STATEMENTS', & ' As stated previously,', & '', & ' If more than one USE statement appears in a scoping unit, the', & ' rename-lists and only-lists are treated as one concatenated', & ' rename-list.', & '', & ' That is, all the non-only statements are treated as one statement So this', & '', & ' use,intrinsic :: iso_fortran_env ! by itself would import all entities', & ' use,intrinsic :: iso_fortran_env, sp=>real32, dp=>real64', & '', & ' is treated like this', & '', & ' use,intrinsic :: iso_fortran_env, sp=>real32, dp=>real64', & '', & ' so the names REAL32 and REAL64 are not available. If you wanted both names', & ' you would have to add', & '', & ' use,intrinsic :: iso use,intrinsic , real32=>real32, real64=>real64', & '', & ' or', & '', & ' use,intrinsic :: iso use,intrinsic , only: real32, real64', & '', & 'SEE ALSO', & ' PRIVATE(3), PUBLIC(3), MODULE(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 use(7fortran)', & ''] shortname="use" call process() case('243','verify') textblock=[character(len=256) :: & '', & 'verify(3fortran) verify(3fortran)', & '', & 'NAME', & ' VERIFY(3) - [CHARACTER:SEARCH] Position of a character in a string of', & ' characters that does not appear in a given set of characters', & '', & 'SYNOPSIS', & ' result = verify(string, set [,back] [,kind] )', & '', & ' elemental integer(kind=KIND) function verify(string,set,back,KIND)', & '', & ' character(len=*,kind=**),intent(in) :: string', & ' character(len=*,kind=**),intent(in) :: set', & ' logical,intent(in),optional :: back', & ' integer,intent(in),optional :: KIND', & '', & 'CHARACTERISTICS', & ' o STRING and SET must be of type character and have the same kind for any', & ' individual call, but that can be any supported character kind.', & '', & ' o KIND must be a constant integer initialization expression and a valid', & ' kind for the integer type.', & '', & ' o BACK shall be of type logical.', & '', & ' o the kind of the returned value is the same as KIND if present. Otherwise', & ' a default integer kind is returned.', & '', & 'DESCRIPTION', & ' VERIFY(3) verifies that all the characters in STRING belong to the set of', & ' characters in SET by identifying the position of the first character in the', & ' string that is not in the set.', & '', & ' This makes it easy to verify strings are all uppercase or lowercase, follow', & ' a basic syntax, only contain printable characters, and many of the', & ' conditions tested for with the C routines ISALNUM(3c), ISALPHA(3c),', & ' ISASCII(3c), ISBLANK(3c), ISCNTRL(3c), ISDIGIT(3c), ISGRAPH(3c),', & ' ISLOWER(3c), ISPRINT(3c), ISPUNCT(3c), ISSPACE(3c), ISUPPER(3c), and', & ' ISXDIGIT(3c); but for a string as well as an array of strings.', & '', & 'OPTIONS', & ' o STRING : The string to search in for an unmatched character.', & '', & ' o SET : The set of characters that must be matched.', & '', & ' o BACK : The direction to look for an unmatched character. The left-most', & ' unmatched character position is returned unless BACK is present and', & ' .false., which causes the position of the right-most unmatched character', & ' to be returned instead of the left-most unmatched character.', & '', & ' o KIND : An integer initialization expression indicating the kind parameter', & ' of the result.', & '', & 'RESULT', & ' If all characters of STRING are found in SET, the result is zero.', & '', & ' If STRING is of zero length a zero (0) is always returned.', & '', & ' Otherwise, if an unmatched character is found The position of the first or', & ' last (if BACK is .false.) unmatched character in STRING is returned,', & ' starting with position one on the left end of the string.', & '', & 'EXAMPLES', & ' Sample program I:', & '', & ' program demo_verify', & ' implicit none', & ' ! some useful character sets', & ' character,parameter :: &', & ' & int*(*) = ''1234567890'', &', & ' & low*(*) = ''abcdefghijklmnopqrstuvwxyz'', &', & ' & upp*(*) = ''ABCDEFGHIJKLMNOPQRSTUVWXYZ'', &', & ' & punc*(*) = "!""#$%&''()*+,-./:;<=>?@[\]^_`{|}~", &', & ' & blank*(*) = '' '', &', & ' & tab = char(11), &', & ' & prnt*(*) = int//low//upp//blank//punc', & '', & ' character(len=:),allocatable :: string', & ' integer :: i', & ' print *, ''basics:''', & ' print *, VERIFY (''ABBA'', ''A'') ! has the value 2.', & ' print *, VERIFY (''ABBA'', ''A'', BACK = .TRUE.) ! has the value 3.', & ' print *, VERIFY (''ABBA'', ''AB'') ! has the value 0.', & '', & ' print *,''find first non-uppercase letter''', & ' ! will produce the location of "d", because there is no match in UPP', & ' write(*,*) ''something unmatched'',verify("ABCdEFG", upp)', & '', & ' print *,''if everything is matched return zero''', & ' ! will produce 0 as all letters have a match', & ' write(*,*) ''everything matched'',verify("ffoorrttrraann", "nartrof")', & '', & ' print *,''easily categorize strings as uppercase, lowercase, ...''', & ' ! easy C-like functionality but does entire strings not just characters', & ' write(*,*)''isdigit 123?'',verify("123", int) == 0', & ' write(*,*)''islower abc?'',verify("abc", low) == 0', & ' write(*,*)''isalpha aBc?'',verify("aBc", low//upp) == 0', & ' write(*,*)''isblank aBc dEf?'',verify("aBc dEf", blank//tab ) /= 0', & ' ! check if all printable characters', & ' string="aB;cde,fgHI!Jklmno PQRSTU vwxyz"', & ' write(*,*)''isprint?'',verify(string,prnt) == 0', & ' ! this now has a nonprintable tab character in it', & ' string(10:10)=char(11)', & ' write(*,*)''isprint?'',verify(string,prnt) == 0', & '', & ' print *,''VERIFY(3) is very powerful using expressions as masks''', & ' ! verify(3) is often used in a logical expression', & ' string=" This is NOT all UPPERCASE "', & ' write(*,*)''all uppercase/spaces?'',verify(string, blank//upp) == 0', & ' string=" This IS all uppercase "', & ' write(*,*) ''string=[''//string//'']''', & ' write(*,*)''all uppercase/spaces?'',verify(string, blank//upp) == 0', & '', & ' ! set and show complex string to be tested', & ' string='' Check this out. Let me know ''', & ' ! show the string being examined', & ' write(*,*) ''string=[''//string//'']''', & ' write(*,*) '' ''//repeat(int,4) ! number line', & '', & ' ! the Fortran functions returns a position just not a logical like C', & ' print *, ''returning a position not just a logical is useful''', & ' ! which can be very useful for parsing strings', & ' write(*,*)''first non-blank character'',verify(string, blank)', & ' write(*,*)''last non-blank character'',verify(string, blank,back=.true.)', & ' write(*,*)''first non-letter non-blank'',verify(string,low//upp//blank)', & '', & ' !VERIFY(3) is elemental so you can check an array of strings in one call', & ' print *, ''elemental''', & ' ! are strings all letters (or blanks)?', & ' write(*,*) ''array of strings'',verify( &', & ' ! strings must all be same length, so force to length 10', & ' & [character(len=10) :: "YES","ok","000","good one","Nope!"], &', & ' & low//upp//blank) == 0', & '', & ' ! rarer, but the set can be an array, not just the strings to test', & ' ! you could do ISPRINT() this (harder) way :>', & ' write(*,*)''isprint?'',.not.all(verify("aBc", [(char(i),i=32,126)])==1)', & ' ! instead of this way', & ' write(*,*)''isprint?'',verify("aBc",prnt) == 0', & '', & ' end program demo_verify', & '', & ' Results:', & '', & ' > basics:', & ' > 2', & ' > 3', & ' > 0', & ' > find first non-uppercase letter', & ' > something unmatched 4', & ' > if everything is matched return zero', & ' > everything matched 0', & ' > easily categorize strings as uppercase, lowercase, ...', & ' > isdigit 123? T', & ' > islower abc? T', & ' > isalpha aBc? T', & ' > isblank aBc dEf? T', & ' > isprint? T', & ' > isprint? F', & ' > VERIFY(3) is very powerful using expressions as masks', & ' > all uppercase/spaces? F', & ' > string=[ This IS all uppercase ]', & ' > all uppercase/spaces? F', & ' > string=[ Check this out. Let me know ]', & ' > 1234567890123456789012345678901234567890', & ' > returning a position not just a logical is useful', & ' > first non-blank character 3', & ' > last non-blank character 29', & ' > first non-letter non-blank 17', & ' > elemental', & ' > array of strings T T F T F', & ' > isprint? T', & ' > isprint? T', & '', & ' Sample program II:', & '', & ' Determine if strings are valid integer representations', & '', & ' program fortran_ints', & ' implicit none', & ' integer :: i', & ' character(len=*),parameter :: ints(*)=[character(len=10) :: &', & ' ''+1 '', &', & ' ''3044848 '', &', & ' ''30.40 '', &', & ' ''September '', &', & ' ''1 2 3'', &', & ' '' -3000 '', &', & ' '' '']', & ' ! show the strings to test', & ' write(*,''("|",*(g0,"|"))'') ints', & ' ! show if strings pass or fail the test done by isint(3)', & ' write(*,''("|",*(1x,l1,8x,"|"))'') isint(ints)', & '', & ' contains', & '', & ' elemental function isint(line) result (lout)', & ' !', & ' ! determine if string is a valid integer representation', & ' ! ignoring trailing spaces and leading spaces', & ' !', & ' character(len=*),parameter :: digits=''0123456789''', & ' character(len=*),intent(in) :: line', & ' character(len=:),allocatable :: name', & ' logical :: lout', & ' lout=.false.', & ' ! make sure at least two characters long to simplify tests', & ' name=adjustl(line)//'' ''', & ' ! blank string', & ' if( name == '''' )return', & ' ! allow one leading sign', & ' if( verify(name(1:1),''+-'') == 0 ) name=name(2:)', & ' ! was just a sign', & ' if( name == '''' )return', & ' lout=verify(trim(name), digits) == 0', & ' end function isint', & '', & ' end program fortran_ints', & '', & ' Results:', & '', & ' |+1 |3044848 |30.40 |September|1 2 3 | -3000 | |', & ' | T | T | F | F | F | T | F |', & '', & ' Sample program III:', & '', & ' Determine if strings represent valid Fortran symbol names', & '', & ' program fortran_symbol_name', & ' implicit none', & ' integer :: i', & ' character(len=*),parameter :: symbols(*)=[character(len=10) :: &', & ' ''A_ '', &', & ' ''10 '', &', & ' ''September '', &', & ' ''A B'', &', & ' ''_A '', &', & ' '' '']', & '', & ' write(*,''("|",*(g0,"|"))'') symbols', & ' write(*,''("|",*(1x,l1,8x,"|"))'') fortran_name(symbols)', & '', & ' contains', & '', & ' elemental function fortran_name(line) result (lout)', & ' !', & ' ! determine if a string is a valid Fortran name', & ' ! ignoring trailing spaces (but not leading spaces)', & ' !', & ' character(len=*),parameter :: int=''0123456789''', & ' character(len=*),parameter :: lower=''abcdefghijklmnopqrstuvwxyz''', & ' character(len=*),parameter :: upper=''ABCDEFGHIJKLMNOPQRSTUVWXYZ''', & ' character(len=*),parameter :: allowed=upper//lower//int//''_''', & '', & ' character(len=*),intent(in) :: line', & ' character(len=:),allocatable :: name', & ' logical :: lout', & ' name=trim(line)', & ' if(len(name).ne.0)then', & ' ! first character is alphameric', & ' lout = verify(name(1:1), lower//upper) == 0 &', & ' ! other characters are allowed in a symbol name', & ' & .and. verify(name,allowed) == 0 &', & ' ! allowable length', & ' & .and. len(name) <= 63', & ' else', & ' lout = .false.', & ' endif', & ' end function fortran_name', & '', & ' end program fortran_symbol_name', & '', & ' Results:', & '', & ' |A_ |10 |September |A B |_A | |', & ' | T | F | T | F | F | F |', & '', & ' Sample program IV:', & '', & ' check if string is of form NN-HHHHH', & '', & ' program checkform', & ' ! check if string is of form NN-HHHHH', & ' implicit none', & ' character(len=*),parameter :: int=''1234567890''', & ' character(len=*),parameter :: hex=''abcdefABCDEF0123456789''', & ' logical :: lout', & ' character(len=80) :: chars', & '', & ' chars=''32-af43d''', & ' lout=.true.', & '', & ' ! are the first two characters integer characters?', & ' lout = lout.and.(verify(chars(1:2), int) == 0)', & '', & ' ! is the third character a dash?', & ' lout = lout.and.(verify(chars(3:3), ''-'') == 0)', & '', & ' ! is remaining string a valid representation of a hex value?', & ' lout = lout.and.(verify(chars(4:8), hex) == 0)', & '', & ' if(lout)then', & ' write(*,*)trim(chars),'' passed''', & ' else', & ' write(*,*)trim(chars),'' failed''', & ' endif', & ' end program checkform', & '', & ' Results:', & '', & ' 32-af43d passed', & '', & ' Sample program V:', & '', & ' exploring uses of elemental functionality and dusty corners', & '', & ' program more_verify', & ' implicit none', & ' character(len=*),parameter :: &', & ' & int=''0123456789'', &', & ' & low=''abcdefghijklmnopqrstuvwxyz'', &', & ' & upp=''ABCDEFGHIJKLMNOPQRSTUVWXYZ'', &', & ' & blank='' ''', & ' ! note character variables in an array have to be of the same length', & ' character(len=6) :: strings(3)=["Go ","right ","home! "]', & ' character(len=2) :: sets(3)=["do","re","me"]', & '', & ' ! elemental -- you can use arrays for both strings and for sets', & '', & ' ! check each string from right to left for non-letter/non-blank', & ' write(*,*)''last non-letter'',verify(strings,upp//low//blank,back=.true.)', & '', & ' ! even BACK can be an array', & ' ! find last non-uppercase character in "Howdy "', & ' ! and first non-lowercase in "there "', & ' write(*,*) verify(strings(1:2),[upp,low],back=[.true.,.false.])', & '', & ' ! using a null string for a set is not well defined. Avoid it', & ' write(*,*) ''null'',verify("for tran ", "", .true.) ! 8,length of string?', & ' ! probably what you expected', & ' write(*,*) ''blank'',verify("for tran ", " ", .true.) ! 7,found ''n''', & '', & ' ! first character in "Go " not in "do",', & ' ! and first letter in "right " not in "ri"', & ' ! and first letter in "home! " not in "me"', & ' write(*,*) verify(strings,sets)', & '', & ' end program more_verify', & '', & ' Results:', & '', & ' > last non-letter 0 0 5', & ' > 6 6', & ' > null 9', & ' > blank 8', & ' > 1 2 1', & '', & 'STANDARD', & ' Fortran 95 , with KIND argument - Fortran 2003', & '', & 'SEE ALSO', & ' Functions that perform operations on character strings, return lengths of', & ' arguments, and search for certain arguments:', & '', & ' o ELEMENTAL: ADJUSTL(3), ADJUSTR(3), INDEX(3), SCAN(3),', & '', & ' o NONELEMENTAL: LEN_TRIM(3), LEN(3), REPEAT(3), TRIM(3)', & '', & ' Fortran intrinsic descriptions (license: MIT) @urbanjost', & '', & ' March 16, 2025 verify(3fortran)', & ''] shortname="verify" call process() case('244','wait') textblock=[character(len=256) :: & '', & 'wait(7fortran) wait(7fortran)', & '', & 'NAME', & ' wait(7f) - [IO] statement performs a wait operation for specified pending', & ' asynchronous data transfer operations', & '', & 'SYNOPSIS', & ' WAIT( [UNIT=] file-unit-number,', & '', & ' [END=label,]', & ' [EOR=label,]', & ' [ERR=label,]', & ' [ID=scalar-int-expr,]', & ' [IOMSG=iomsg-variable,]', & ' [IOSTAT=scalar-int-variable]', & ' )', & '', & 'DESCRIPTION', & ' The WAIT(7f) statement performs a wait operation for specified pending', & ' asynchronous data transfer operations.', & '', & ' The CLOSE, INQUIRE, and file positioning statements may also perform wait', & ' operations.', & '', & ' Execution of a WAIT statement specifying a unit that does not exist, has no', & ' file connected to it, or is not open for asynchronous input/output is', & ' permitted, provided that the WAIT statement has no ID= specifier; such a', & ' WAIT statement does not cause an error or end-of-file condition to occur.', & '', & ' An EOR= specifier has no effect if the pending data transfer operation is', & ' not a nonadvancing read.', & '', & ' An END= specifier has no effect if the pending data transfer operation is', & ' not a READ.', & '', & 'OPTIONS', & ' No specifier shall appear more than once in a given wait-spec-list.', & '', & ' [UNIT=]file-unit-number A file-unit-number shall be specified', & ' in a wait-spec-list; if the optional', & ' characters UNIT= are omitted, the', & ' file-unit-number shall be the first item', & ' in the wait-spec-list.', & ' END=label, EOR=label, ERR=label The label in the ERR=, EOR=,', & ' or END= specifier is a statement', & ' label of a branch target statement', & ' that appears in the same scoping', & ' unit as the WAIT statement.', & ' ID=scalar-int-expr The value of the expression specified in', & ' the ID= specifier shall be the identifier', & ' of a pending data transfer operation for the', & ' specified unit. If the ID= specifier appears, a', & ' wait operation for the specified data transfer', & ' operation is performed. If the ID= specifier is', & ' omitted, wait operations for all pending data', & ' transfers for the specified unit are performed.', & ' IOMSG=iomsg-variable if IOSTAT is not zero, a corresponding message', & ' describing the error', & ' IOSTAT=scalar-int-variable status value indicating if an error occurred.', & ' zero (0) indicates no error occurred.', & '', & 'EXAMPLE', & 'SEE ALSO', & ' BACKSPACE(7), CLOSE(7), ENDFILE(7), FLUSH(7), INQUIRE(7), OPEN(7), PRINT(7),', & ' READ(7), REWIND(7), WAIT(7), WRITE(7)', & '', & ' March 16, 2025 wait(7fortran)', & ''] shortname="wait" call process() case('245','where') textblock=[character(len=256) :: & '', & 'where(7fortran) where(7fortran)', & '', & 'NAME', & ' where(7f) - [ASSIGNMENT] masked array assignment', & '', & 'SYNTAX', & ' WHERE statement:', & '', & ' WHERE ( mask-expr ) where-assignment-stmt', & '', & ' WHERE construct without ELSEWHERE:', & '', & ' [where-construct-name:] WHERE ( mask-expr )', & ' ELSEWHERE (mask-expr ) [where-construct-name]', & '', & ' WHERE construct with ELSEWHEREs:', & '', & ' [where-construct-name:] WHERE ( mask-expr )', & ' [ELSEWHERE (mask-expr )', & ' elemental-statements]', & ' [ELSEWHERE (mask-expr )', & ' elemental-statements]', & ' :', & ' [ELSEWHERE', & ' elemental-statements', & ' ]', & ' END WHERE [where-construct-name]', & '', & 'DESCRIPTION', & ' A masked array assignment is either a WHERE statement or a WHERE construct.', & ' It is used to mask the evaluation of expressions and assignment of values in', & ' array assignment statements, according to the value of a logical array', & ' expression.', & '', & ' where-assignment-stmt that is a defined assignment shall be elemental.', & '', & ' A statement that is part of a where-body-construct shall not be a branch', & ' target statement.', & '', & ' If a where-construct contains a where-stmt, a masked-elsewhere-stmt, or', & ' another where-construct then each mask-expr within the where-construct shall', & ' have the same shape. In each where-assignment-stmt, the mask-expr and the', & ' variable being defined shall be arrays of the same shape.', & '', & ' Examples of a masked array assignment are:', & '', & ' WHERE (TEMP > 100.0) TEMP = TEMP - REDUCE_TEMP', & '', & ' where (PRESSURE <= 1.0)', & ' PRESSURE = PRESSURE + INC_PRESSURE', & ' TEMP = TEMP - 5.0', & ' elsewhere', & ' RAINING = .TRUE.', & ' endwhere', & '', & ' Interpretation of masked array assignments', & '', & ' When a WHERE statement or a where-construct-stmt is executed, a control mask', & ' is established. In addition, when a WHERE construct statement is executed, a', & ' pending control mask is established. If the statement does not appear as', & ' part of a where-body-construct, the mask-expr of the statement is evaluated,', & ' and the control mask is established to be the value of mask-expr . The', & ' pending control mask is established to have the value .NOT. mask-expr upon', & ' execution of a WHERE construct statement that does not appear as part of a', & ' where-body-construct. The mask-expr is evaluated only once.', & '', & ' Each statement in a WHERE construct is executed in sequence.', & '', & ' Upon execution of a masked-elsewhere-stmt, the following actions take place', & ' in sequence.', & '', & ' 1. The control mask mc is established to have the value of the pending', & ' control mask.', & '', & ' 2. The pending control mask is established to have the value mc .AND.', & ' (.NOT. mask-expr ).', & '', & ' 3. The control mask mc is established to have the value mc .AND. mask-expr', & ' .', & '', & ' The mask-expr is evaluated at most once.', & '', & ' Upon execution of an ELSEWHERE statement, the control mask is established to', & ' have the value of the pending control mask. No new pending control mask', & ' value is established.', & '', & ' Upon execution of an ENDWHERE statement, the control mask and pending', & ' control mask are established to have the values they had prior to the', & ' execution of the corresponding WHERE construct statement. Following the', & ' execution of a WHERE statement that appears as a where-body-construct, the', & ' control mask is established to have the value it had prior to the execution', & ' of the WHERE statement.', & '', & ' The establishment of control masks and the pending control mask is', & ' illustrated with the following example:', & '', & ' where(cond1) ! Statement 1', & ' . . .', & ' elsewhere(cond2) ! Statement 2', & ' . . .', & ' elsewhere ! Statement 3', & ' . . .', & ' end where', & '', & ' Following execution of statement 1, the control mask has the value cond1 and', & ' the pending control mask has the value .NOT. cond1. Following execution of', & ' statement 2, the control mask has the value (.NOT. cond1) .AND. cond2 and', & ' the pending control mask has the value (.NOT. cond1) .AND. (.NOT. cond2).', & ' Following execution of statement 3, the control mask has the value (.NOT.', & ' cond1) .AND. (.NOT. cond2). The false condition values are propagated', & ' through the execution of the masked ELSEWHERE statement.', & '', & ' Upon execution of a WHERE construct statement that is part of a where-body-', & ' construct, the pending control mask is established to have the value mc', & ' .AND. (.NOT. mask-expr ). The control mask is then established to have the', & ' value mc .AND. mask-expr. The mask-expr is evaluated at most once.', & '', & ' Upon execution of a WHERE statement that is part of a where-body-construct,', & ' the control mask is established to have the value mc .AND. mask-expr. The', & ' pending control mask is not altered.', & '', & ' If a nonelemental function reference occurs in the expr or variable of a', & ' where-assignment-stmt or in a mask-expr , the function is evaluated without', & ' any masked control; that is, all of its argument expressions are fully', & ' evaluated and the function is fully evaluated. If the result is an array and', & ' the reference is not within the argument list of a nonelemental function,', & ' elements corresponding to true values in the control mask are selected for', & ' use in evaluating the expr, variable or mask-expr.', & '', & ' If an elemental operation or function reference occurs in the expr or', & ' variable of a where-assignment-stmt or in a mask-expr , and is not within', & ' the argument list of a nonelemental function reference, the operation is', & ' performed or the function is evaluated only for the elements corresponding', & ' to true values of the control mask.', & '', & ' If an array constructor appears in a where-assignment-stmt or in a mask-expr', & ' , the array constructor is evaluated without any masked control and then the', & ' where-assignment-stmt is executed or the mask-expr is evaluated.', & '', & ' When a where-assignment-stmt is executed, the values of expr that correspond', & ' to true values of the control mask are assigned to the corresponding', & ' elements of the variable.', & '', & ' The value of the control mask is established by the execution of a WHERE', & ' statement, a WHERE construct statement, an ELSEWHERE statement, a masked', & ' ELSEWHERE statement, or an ENDWHERE statement. Subsequent changes to the', & ' value of entities in a mask-expr have no effect on the value of the control', & ' mask. The execution of a function reference in the mask expression of a', & ' WHERE statement is permitted to affect entities in the assignment statement.', & '', & ' Examples of function references in masked array assignments are:', & '', & ' where (A > 0.0)', & ' A = LOG (A) ! LOG is invoked only for positive elements.', & ' A = A / SUM (LOG (A)) ! LOG is invoked for all elements', & ' ! because SUM is transformational.', & ' end where', & '', & 'EXAMPLE', & ' Sample', & '', & ' program demo_where', & ' ! Example of WHERE, ELSE WHERE, END WHERE', & ' integer,parameter :: nd=10, ndh=nd/2, nduh=nd-ndh-1', & ' integer :: j', & ' real, dimension(nd):: a=[ (2*j,j=1,nd) ]', & ' real, dimension(nd):: b ! =[ ndh*1.0, 0.0, nduh*2.0 ]', & ' real, dimension(nd):: c ! =[ nd*-77.77 ]', & ' integer iflag(nd)', & ' data b/ndh*1,0.0,nduh*2./,c/nd*-77.77/', & '', & ' where (b.ne.0) c=a/b', & ' write (*,2000) c(1:nd)', & ' !', & ' ! The above protects against divide by zero, but doesn''t actually', & ' ! assign values to elements in c when the corresponding element in', & ' ! b is zero The following covers that, and sets a flag when a divide', & ' ! by zero is present', & ' !', & ' where (b(1:nd).ne.0.0)', & ' c=a/b', & ' iflag=0', & ' else where', & ' c=0.0', & ' iflag=1', & ' end where', & '', & ' write (*,2000) c(1:nd)', & ' write (*,1000) iflag(1:nd)', & ' 1000 format (''iflag= '',/,(10i7))', & ' 2000 format (''a/b = '',/,(10f7.2))', & ' end program demo_where', & '', & ' Results:', & '', & ' > a/b =', & ' > 2.00 4.00 6.00 8.00 10.00 -77.77 7.00 8.00 9.00 10.00', & ' > a/b =', & ' > 2.00 4.00 6.00 8.00 10.00 0.00 7.00 8.00 9.00 10.00', & ' > iflag=', & ' > 0 0 0 0 0 1 0 0 0 0', & '', & ' March 16, 2025 where(7fortran)', & ''] shortname="where" call process() case('246','write') textblock=[character(len=256) :: & '', & 'write(7fortran) write(7fortran)', & '', & 'NAME', & 'SYNOPSIS', & 'DESCRIPTION', & 'OPTIONS', & 'SEE ALSO', & ' BACKSPACE(7), CLOSE(7), ENDFILE(7), FLUSH(7), INQUIRE(7), OPEN(7), PRINT(7),', & ' READ(7), REWIND(7), WAIT(7), WRITE(7)', & '', & ' March 16, 2025 write(7fortran)', & ''] shortname="write" call process() case default allocate (character(len=256) :: textblock(0)) end select contains subroutine process() if(present(topic))then if(topic)then textblock=[character(len=len(shortname)) :: shortname] endif endif if(present(prefix))then if(prefix)then do i=1,size(textblock) textblock(i)= shortname//':'//trim(textblock(i)) enddo endif endif if(present(m_help))then if(m_help)then textblock=[character(len=len(textblock)+1) :: ' ',textblock] ! add blank line to put shortname into textblock=' '//textblock ! shift to right by one character textblock(1)=shortname endif endif end subroutine process end function help_intrinsics_one !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== subroutine sort_name(lines) !@(#) sort_name(3fp):sort strings(a-z) over specified field using shell sort starting with [ character character(len = *) :: lines(:) character(len = :),allocatable :: ihold integer :: n, igap, i, j, k, jg n = size(lines) if(n.gt.0)then allocate(character(len = len(lines(1))) :: ihold) else ihold = '' endif igap = n INFINITE: do igap = igap/2 if(igap.eq.0) exit INFINITE k = n-igap i = 1 INNER: do j = i INSIDE: do jg = j+igap if( lle( lower(lines(j)), lower(lines(jg)) ) )exit INSIDE ihold = lines(j) lines(j) = lines(jg) lines(jg) = ihold j = j-igap if(j.lt.1) exit INSIDE enddo INSIDE i = i+1 if(i.gt.k) exit INNER enddo INNER enddo INFINITE end subroutine sort_name !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== elemental pure function lower(str) result (string) !@(#) M_strings::lower(3f): Changes a string to lowercase over specified range character(*), intent(In) :: str character(len(str)) :: string integer :: i string = str do i = 1, len_trim(str) ! step thru each letter in the string select case (str(i:i)) case ('A':'Z') string(i:i) = char(iachar(str(i:i))+32) ! change letter to miniscule case default end select end do end function lower !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !=================================================================================================================================== end module M_intrinsics !=================================================================================================================================== !()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()= !===================================================================================================================================